嵌入式系統中進程間通信的監視方法
被監視進程進入系統調用和退出系統調用時,都會觸發 wait() 返回,使我們的程序有機會運行。因此,我們需要使用 syscall_entry 來記錄當前時刻是被監視進程進入系統調用,還是退出系統調用。這是一個開關量,非常容易理解。 最后,每次處理完,都需要再次調用參數為 PTRACE_SYSCALL 的 ptrace ,準備監視下一次的系統調用。
本文引用地址:http://cqxgywz.com/article/201610/305865.htm上面的程序雖然很簡單,但已經可以完整的表現出利用 ptrace 截獲被監視進程的 sendto 系統調用的過程。值得補充一點的是,利用 ptrace 也可以獲得 sendto 向外發送的數據。
sendto 系統調用的定義是:
#include sys/types.h> #include sys/socket.h> size_t sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socket len_t tolen); |
sendto 包含了六個參數,特別是 msg 參數指出了發送的數據內容。參數 to 指出了發送的目標。利用 PTRACE_PEEKDATA 參數的 ptrace ,監視程序將可以獲得 sendto 的全部的六個參數。這樣監視程序就完全獲得了被監視進程要向外發送的數據和發送目標。具體的實現細節在此不再展開論述。請參考 man ptrace說明手冊。
監視系統的體系和應用
利用上面討論的技術,我們開發了可以運行在 mips 目標板上的監視程序,名為 ipcmsg 。它是一個命令行程序。在我們的應用環境中,它的使用方法是:
root@host:~$ ipcmsg -p pid -l xxx.xxx.xxx.xxx -b 6000 |
pid 是被監視進程的 pid ,可以通過 ps 命令獲得。 -l 參數后面指定 PC 主機的 IP 地址。 -b 參數指明了接收的端口號。
最初進行監視時, ipcmsg 是沒有 IP 地址和端口號參數的。所有信息是輸出到串口控制臺中。這既影響了運行的效率(大量的在串口上的輸出會影響目標板的運行速度),也不利于信息的處理。由于我們的目標板具備以太網接口,我們很容易的想到將 ipcmsg 截獲的數據包轉發到 PC 主機上。使用 PC 主機更便于對進程間通信的數據包進行分析。在 PC 主機上,我們使用 wireshark 這個非常流行的開源的網絡報文分析軟件接收來自目標板的信息。
在實際的使用過程中,我們使用以太網線將目標板與 PC 主機相連。然后,在目標板上啟動 ipcmsg ,并為其指定監視進程的 pid 。 ipcmsg運行后,我們在PC主機上啟動 wireshark 接收來自 ipcmsg 的數據包。這些數據包中包含了 mips 目標板上進程間通信的信息。利用我們為 ipcmsg 專門開發的 wireshark 插件,在 wireshark 上,我們可以詳細的分解 ipcmsg 轉發來的數據包,非常直觀的分析進程間通信的過程和可能存在的問題。
從圖中可以看到,我們從 ipcmsg 獲得了進程間通信的方式,參數( path 是 AF_UNIX域 socket 地址參數),方向和內容,以及進程名稱。這些信息幫助我們對嵌入式系統的運行狀態進行分析。而這一切非常直觀和便于操作。












評論