本文詳細描述了一種利用 ptrace 系統(tǒng)調(diào)用,實現(xiàn)嵌入式系統(tǒng)內(nèi)部進程通信的監(jiān)視方法,并提供了相應的實現(xiàn)方案。 概述
復雜的嵌入式系統(tǒng)中,常常同時運行著相當多的進程。這些進程之間頻繁的進行著大量的通信動作。進程的運行狀態(tài)與這些不斷發(fā)生的通信有著直接和緊密的聯(lián)系。通過對進程間通信的監(jiān)視,開發(fā)人員可以掌控系統(tǒng)內(nèi)部運轉(zhuǎn)的狀態(tài)。發(fā)現(xiàn)錯誤時,利用獲取到的進程間通信的信息,調(diào)試工程師更容易發(fā)現(xiàn)問題之所在。
但是,嵌入式系統(tǒng)與開發(fā)人員的接口往往較為單一。開發(fā)人員廣泛使用通常是基于串口或是網(wǎng)絡(luò)接口的終端( console )方式。在這個模式下,開發(fā)人員難以細致準確的觀察進程間的通信。而且對于計算能力薄弱的嵌入式系統(tǒng)來說,在終端上打印出通信報文既會影響系統(tǒng)內(nèi)部的運行,同時,也會使屏幕上充斥的過多的無用信息,使開發(fā)人員的分析工作無從下手。
為了解決這個問題,在嵌入式 Linux 的平臺上,我們開發(fā)了一整套用于監(jiān)視嵌入式系統(tǒng)內(nèi)進程間通信的軟件,用于調(diào)試我們開發(fā)的嵌入式產(chǎn)品。本文詳細介紹了監(jiān)視嵌入式系統(tǒng)內(nèi)進程間通信的技術(shù)原理和實現(xiàn)監(jiān)視軟件的推薦方案。
監(jiān)視方法的基本原理
Linux 中的 ptrace 系統(tǒng)調(diào)用是監(jiān)視進程間通信的關(guān)鍵。 ptrace 為我們提供了一種觀察和控制其它進程的方法。利用 ptrace ,我們可以截獲正在運行的進程的所有的系統(tǒng)調(diào)用。所謂截獲是指,監(jiān)視程序可以在這些系統(tǒng)調(diào)用發(fā)生和退出時,獲得系統(tǒng)調(diào)用的參數(shù),甚至修改參數(shù)。這些系統(tǒng)調(diào)用包括: read , write , sendto, recv 等等。在 Linux 中,用戶可以通過“ man syscalls ”來查看當前版本的 Linux 所支持的系統(tǒng)調(diào)用。
在我們的 Linux 嵌入式產(chǎn)品中, AF_UNIX 域的 socket 被廣泛使用。它被用來完成進程間通信的工作。 AF_UNIX 域的 socket 的編程模型與通常的 socket 編程模型完全相同。我們的使用方法是:接收進程創(chuàng)建一個 AF_UNIX 域的 socket ,設(shè)定其模式為數(shù)據(jù)報( SOCK_DGRAM )。在這之后,為其綁定一個含路徑的文件名,例如: /var/tmp/receive.unix 。這個文件名被內(nèi)核用于標識socket。發(fā)送進程創(chuàng)建一個相同模式的 AF_UNIX 域的 socket 。然后,調(diào)用 sendto 向接收進程發(fā)送消息。用來標識接收進程 socket 的就是前面提到的文件名,也就是 /var/tmp/receive.unix 。而接收進程使用 recvfrom 系統(tǒng)調(diào)用,就可以收到發(fā)送進程發(fā)出的消息。
因此,通過 ptrace ,一旦我們接管了被監(jiān)視進程的 sendto 和 recvfrom 系統(tǒng)調(diào)用,將使我們能夠截獲到使用這兩個系統(tǒng)調(diào)用進行通信的數(shù)據(jù)。
ptrace 系統(tǒng)調(diào)用的定義如下:
#include sys/ptrace.h> long int ptrace(enum __ptrace_request request, pid_t pid, void * addr, void * data); |
它共有四個參數(shù)。 request 的值決定 ptrace 執(zhí)行什么樣的任務。 pid 指明被追蹤的進程的 id 。 request 參數(shù)決定了是否需要一個有效的 addr 參數(shù),還是僅用 NULL 即可。如果有必要使用有效的 addr 參數(shù),它的含義是被追蹤的進程的進程空間的偏移量。 data 類似于 addr 參數(shù),有時也可以使用 NULL 來代替。如果它被使用,它的含義是指向一些數(shù)據(jù),這些數(shù)據(jù)希望被放置到被監(jiān)視的進程的用戶空間中。
一個完整的示例代碼將向我們展示監(jiān)視進程間通信的技術(shù)細節(jié)和關(guān)鍵點。代碼按前后順序分段說明。
#include stdio.h> #include stdlib.h> #include sys/ptrace.h> #include sys/wait.h> #include Linux/user.h> #include sys/socket.h> #include sys/un.h> #include Linux/net.h> |
為了在程序中使用 ptrace 系統(tǒng)調(diào)用,我們需要增加 ptrace.h 頭文件。為了能夠獲得截獲的系統(tǒng)調(diào)用的函數(shù)入?yún)?,我們需要使?struct user_regs_struct 結(jié)構(gòu)。它在 user.h 中被定義。由于在程序中使用了信號,因此,我們也需要 wait.h 。我們要監(jiān)視通信動作, socket.h 和 un.h 則是必不可少的。
下面是程序的入口主函數(shù):
int main (int argc, char *argv[]) { int status; int syscall_entry = 0; int traced_process; struct user_regs_struct u_in; |
status 用于記錄被監(jiān)視進程的狀態(tài)變化; syscall_entry 記錄被監(jiān)視進程當前是進入系統(tǒng)調(diào)用,還是從系統(tǒng)調(diào)用中返回; u_in 用來獲得截獲的系統(tǒng)調(diào)用的參數(shù); traced_process 則是被監(jiān)視進程的 PID 值。
traced_process = atoi(argv[1]); /* 從命令行得到監(jiān)視進程的PID */ ptrace(PTRACE_ATTACH, traced_process, NULL, NULL); wait(status); /* 等待被監(jiān)視進程狀態(tài)變化 */ ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL); |
參數(shù)為 PTRACE_ATTACH 的 ptrace 對被監(jiān)視進程在內(nèi)核中的進程結(jié)構(gòu)進行修改。使被監(jiān)視進程成為當前程序的子進程。一旦被監(jiān)視進程的狀態(tài)發(fā)生變化, wait() 將返回。程序再次調(diào)用 ptrace 。這次的參數(shù)為 PTRACE_SYSCALL 。被監(jiān)視進程的進程結(jié)構(gòu)再次被修改,其 trace 標志被激活。內(nèi)核將在被監(jiān)視進程的每一次系統(tǒng)調(diào)用時,觸發(fā)當前程序的運行。
While (1) { /* 等待被監(jiān)視程序調(diào)用系統(tǒng)調(diào)用或是發(fā)生其它狀態(tài)變化 */ wait(status); /* 如果被監(jiān)視進程退出,函數(shù)返回真。程序退出 */ if ( WIFEXITED(status) ) break; ptrace(PTRACE_GETREGS, traced_process, 0, u_in); if (u_in.orig_eax == 102 u_in.ebx == SYS_SENDTO) { if (syscall_entry == 0) { /* syscall entry */ insyscall = 1; printf(call sendto()n); } else { /* Syscall exit */ Syscall_entry = 0; } } ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL); } /* while */ return 0; } /* main */ |
網(wǎng)站首頁 |網(wǎng)站簡介 | 關(guān)于我們 | 廣告業(yè)務 | 投稿信箱
Copyright © 2000-2020 www.ksmtzm.com All Rights Reserved.
中國網(wǎng)絡(luò)消費網(wǎng) 版權(quán)所有 未經(jīng)書面授權(quán) 不得復制或建立鏡像
聯(lián)系郵箱:920 891 263@qq.com
亚洲三级| 高冷受做到失禁颤抖哭着求饶| 国产偷v国产偷v亚洲高清| 杨门十二寡妇肉床艳史电影| 欧美xxxxx高潮喷水麻豆| 大内密探零零性| 老张和老李互相换女h| 久久精品a亚洲国产v高清不卡| 国产精品高潮呻吟av久久96| chinese熟女老太hd| 蜜臀av在线播放| 亚洲av无码乱码在线观看| 国产亚洲精品久久久久秋霞| 免费观看a级片| 99er热精品视频国产免费| 女学生被躁到高潮免费视频| 老妇性hqmaturetube| 强行糟蹋人妻hd中文字幕| 人人妻人人澡人人爽人人精品av | 韩国日本欧美大尺寸suv| 国产人成无码视频在线观看| 浪小辉巨大粗爽gvvideos| 宝贝∽好硬∽好爽一再...| 欧美乱妇日本无乱码特黄大片| 国产小受呻吟av视频在线观看| 女人与拘做受全过程免费视频| 性视频播放免费视频| 午夜福利理论片在线观看| 男男黄gay片免费网站www| 久久久久亚洲AV成人片| 偷偷鲁2020精品偷拍视频| 精品人妻系列无码人妻免费视频 | 校园h学长含着粉嫩小奶| 麻豆av福利av久久av| 免费看又黄又无码的网站| 含着奶头搓揉深深挺进| 奶头被医生摸得受不了| 羞羞视频| 第一次进入女朋友的身体注意事项| 亚洲av国产爽歪歪无码| 亚洲三级|