
本文詳細描述了一種利用 ptrace 系統調用,實現嵌入式系統內部進程通信的監視方法,并提供了相應的實現方案。 概述
復雜的嵌入式系統中,常常同時運行著相當多的進程。這些進程之間頻繁的進行著大量的通信動作。進程的運行狀態與這些不斷發生的通信有著直接和緊密的聯系。通過對進程間通信的監視,開發人員可以掌控系統內部運轉的狀態。發現錯誤時,利用獲取到的進程間通信的信息,調試工程師更容易發現問題之所在。
但是,嵌入式系統與開發人員的接口往往較為單一。開發人員廣泛使用通常是基于串口或是網絡接口的終端( console )方式。在這個模式下,開發人員難以細致準確的觀察進程間的通信。而且對于計算能力薄弱的嵌入式系統來說,在終端上打印出通信報文既會影響系統內部的運行,同時,也會使屏幕上充斥的過多的無用信息,使開發人員的分析工作無從下手。
為了解決這個問題,在嵌入式 Linux 的平臺上,我們開發了一整套用于監視嵌入式系統內進程間通信的軟件,用于調試我們開發的嵌入式產品。本文詳細介紹了監視嵌入式系統內進程間通信的技術原理和實現監視軟件的推薦方案。
監視方法的基本原理
Linux 中的 ptrace 系統調用是監視進程間通信的關鍵。 ptrace 為我們提供了一種觀察和控制其它進程的方法。利用 ptrace ,我們可以截獲正在運行的進程的所有的系統調用。所謂截獲是指,監視程序可以在這些系統調用發生和退出時,獲得系統調用的參數,甚至修改參數。這些系統調用包括: read , write , sendto, recv 等等。在 Linux 中,用戶可以通過“ man syscalls ”來查看當前版本的 Linux 所支持的系統調用。
在我們的 Linux 嵌入式產品中, AF_UNIX 域的 socket 被廣泛使用。它被用來完成進程間通信的工作。 AF_UNIX 域的 socket 的編程模型與通常的 socket 編程模型完全相同。我們的使用方法是:接收進程創建一個 AF_UNIX 域的 socket ,設定其模式為數據報( SOCK_DGRAM )。在這之后,為其綁定一個含路徑的文件名,例如: /var/tmp/receive.unix 。這個文件名被內核用于標識socket。發送進程創建一個相同模式的 AF_UNIX 域的 socket 。然后,調用 sendto 向接收進程發送消息。用來標識接收進程 socket 的就是前面提到的文件名,也就是 /var/tmp/receive.unix 。而接收進程使用 recvfrom 系統調用,就可以收到發送進程發出的消息。
因此,通過 ptrace ,一旦我們接管了被監視進程的 sendto 和 recvfrom 系統調用,將使我們能夠截獲到使用這兩個系統調用進行通信的數據。
ptrace 系統調用的定義如下:
| #include sys/ptrace.h> long int ptrace(enum __ptrace_request request, pid_t pid, void * addr, void * data); |
它共有四個參數。 request 的值決定 ptrace 執行什么樣的任務。 pid 指明被追蹤的進程的 id 。 request 參數決定了是否需要一個有效的 addr 參數,還是僅用 NULL 即可。如果有必要使用有效的 addr 參數,它的含義是被追蹤的進程的進程空間的偏移量。 data 類似于 addr 參數,有時也可以使用 NULL 來代替。如果它被使用,它的含義是指向一些數據,這些數據希望被放置到被監視的進程的用戶空間中。
一個完整的示例代碼將向我們展示監視進程間通信的技術細節和關鍵點。代碼按前后順序分段說明。
| #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 系統調用,我們需要增加 ptrace.h 頭文件。為了能夠獲得截獲的系統調用的函數入參,我們需要使用 struct user_regs_struct 結構。它在 user.h 中被定義。由于在程序中使用了信號,因此,我們也需要 wait.h 。我們要監視通信動作, socket.h 和 un.h 則是必不可少的。
下面是程序的入口主函數:
| int main (int argc, char *argv[]) { int status; int syscall_entry = 0; int traced_process; struct user_regs_struct u_in; |
status 用于記錄被監視進程的狀態變化; syscall_entry 記錄被監視進程當前是進入系統調用,還是從系統調用中返回; u_in 用來獲得截獲的系統調用的參數; traced_process 則是被監視進程的 PID 值。
| traced_process = atoi(argv[1]); /* 從命令行得到監視進程的PID */ ptrace(PTRACE_ATTACH, traced_process, NULL, NULL); wait(status); /* 等待被監視進程狀態變化 */ ptrace(PTRACE_SYSCALL, traced_process, NULL, NULL); |
參數為 PTRACE_ATTACH 的 ptrace 對被監視進程在內核中的進程結構進行修改。使被監視進程成為當前程序的子進程。一旦被監視進程的狀態發生變化, wait() 將返回。程序再次調用 ptrace 。這次的參數為 PTRACE_SYSCALL 。被監視進程的進程結構再次被修改,其 trace 標志被激活。內核將在被監視進程的每一次系統調用時,觸發當前程序的運行。
| While (1) { /* 等待被監視程序調用系統調用或是發生其它狀態變化 */ wait(status); /* 如果被監視進程退出,函數返回真。程序退出 */ 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 */ |
網站首頁 |網站簡介 | 關于我們 | 廣告業務 | 投稿信箱
Copyright © 2000-2020 www.yjkq2010.com All Rights Reserved.
中國網絡消費網 版權所有 未經書面授權 不得復制或建立鏡像
聯系郵箱:920 891 263@qq.com
欧美色综合网_狠狠色狠色综合曰曰_麻豆精品一区二区av白丝在线_久久精品综合一区 久久99久久精品| 亚洲精品免费在线观看| 久久先锋影音av| 一区二区视频免费在线观看| 蜜桃av一区二区三区| 成人午夜伦理影院| 国产精品福利在线播放| 国产麻豆精品视频| 久久蜜桃av一区二区天堂| 免费亚洲电影在线| 色av一区二区| 亚洲视频在线一区观看| 国产成人无遮挡在线视频| 欧美一区二区三区性视频| 亚洲国产精品久久艾草纯爱| 国产精品美女久久福利网站| 国产不卡高清在线观看视频| 亚洲另类春色国产| 欧美一级国产精品| av综合在线播放| 日韩1区2区3区| 国产女主播一区| 欧美三级电影精品| 国产麻豆精品95视频| 一区二区三区中文在线| 亚洲精品在线三区| 欧美日韩一区国产| 国产99精品在线观看| 亚洲成人在线免费| 中文一区在线播放| 3d动漫精品啪啪| av动漫一区二区| 激情丁香综合五月| 天堂蜜桃一区二区三区 | 亚洲综合在线第一页| 日韩欧美中文字幕精品| 91在线观看一区二区| 久久se精品一区二区| 亚洲高清在线精品| 亚洲欧美激情视频在线观看一区二区三区 | 国产亚洲欧美激情| 欧美群妇大交群中文字幕| 国产成人av影院| 日本vs亚洲vs韩国一区三区 | 国产999精品久久| 欧美一区二区三区不卡| 国产不卡在线视频| 国产不卡一区视频| 亚洲成人一区二区在线观看| 成人欧美一区二区三区视频网页 | 国产欧美一区二区精品久导航 | 日韩一区二区在线观看视频播放| av午夜精品一区二区三区| 久久精品99久久久| 污片在线观看一区二区| 一区二区激情小说| 亚洲精品欧美二区三区中文字幕| 国产清纯白嫩初高生在线观看91| 日韩一级黄色片| 欧美色精品在线视频| 色综合久久99| 日本韩国一区二区三区| 色婷婷综合激情| 91亚洲国产成人精品一区二区三| 成人午夜电影网站| av成人老司机| 色94色欧美sute亚洲线路二| 色哟哟在线观看一区二区三区| av网站免费线看精品| eeuss影院一区二区三区| a4yy欧美一区二区三区| 成人app网站| 色哟哟精品一区| 欧美日精品一区视频| 91精品视频网| 精品日韩一区二区三区| 久久综合色之久久综合| 久久综合九色综合97婷婷女人| 日韩女优av电影在线观看| 精品久久久久久久人人人人传媒| 久久综合九色综合欧美98| 欧美激情中文字幕一区二区| 日韩毛片在线免费观看| 午夜精品久久久久久久99水蜜桃 | 精彩视频一区二区| 国产精品原创巨作av| 99在线热播精品免费| 色av成人天堂桃色av| 91麻豆精品国产91久久久更新时间| 欧美精品tushy高清| 欧美videossexotv100| 国产欧美精品日韩区二区麻豆天美| 亚洲欧美另类综合偷拍| 同产精品九九九| 国产精品综合在线视频| 色婷婷av一区二区三区大白胸| 欧美高清视频不卡网| 久久久精品2019中文字幕之3| 中文字幕一区二区三区视频| 亚洲制服丝袜av| 国产综合色精品一区二区三区| 99麻豆久久久国产精品免费优播| 欧美亚洲综合网| 国产日韩欧美电影| 日韩电影免费在线看| 91在线视频在线| www国产精品av| 亚洲一二三级电影| kk眼镜猥琐国模调教系列一区二区| 欧美一级二级在线观看| 亚洲黄色小视频| 成人国产电影网| 精品久久久久香蕉网| 亚洲综合激情网| 成人精品免费看| 日韩精品中文字幕一区二区三区| 国产成人精品综合在线观看| 国产麻豆一精品一av一免费 | 日本在线不卡一区| 99国产精品一区| 国产亚洲1区2区3区| 人禽交欧美网站| 欧美午夜一区二区| 国产精品传媒在线| 国产一区不卡在线| 日韩一区和二区| 亚洲国产精品久久人人爱| 99在线视频精品| 欧美经典一区二区| 青青草原综合久久大伊人精品| 在线免费不卡电影| 亚洲另类在线制服丝袜| 99re这里都是精品| 自拍偷拍亚洲激情| 99精品视频在线观看免费| 国产精品午夜免费| 成人一区二区在线观看| 久久精品欧美一区二区三区不卡| 另类小说视频一区二区| 日韩丝袜情趣美女图片| 免费观看在线综合| 日韩欧美一区二区不卡| 日本美女视频一区二区| 日韩欧美国产系列| 国内偷窥港台综合视频在线播放| 日韩视频在线你懂得| 六月丁香婷婷久久| www精品美女久久久tv| 国产一区二区成人久久免费影院| 欧美电视剧在线观看完整版| 激情久久五月天| 欧美变态凌虐bdsm| 日韩一区欧美小说| 91精品国产综合久久婷婷香蕉 | 色婷婷久久久亚洲一区二区三区| av高清久久久| 国产农村妇女精品| 一区二区激情视频| 亚洲成人精品一区二区| av不卡在线观看| 91成人免费网站| aaa国产一区| 高清国产一区二区| 精品无人区卡一卡二卡三乱码免费卡 | 免费观看日韩av| 久久影音资源网| 成人av午夜电影| 亚洲成人av福利| 久久久久青草大香线综合精品| 成人永久aaa| 五月婷婷激情综合网| 久久网站最新地址| 在线观看精品一区| 国产综合色产在线精品| 国产精品卡一卡二| 欧美人成免费网站| 国产黄色精品网站| 亚洲成a人v欧美综合天堂下载| 欧美大片一区二区三区| 97se亚洲国产综合自在线不卡| 午夜精品国产更新| 中文一区二区在线观看| 欧美精品v国产精品v日韩精品 | 日本午夜精品视频在线观看| 久久久99精品久久| 欧美日韩久久久| 成人国产精品免费观看| 青青草国产成人av片免费| 中文一区二区完整视频在线观看 | 92精品国产成人观看免费| 青青草视频一区| 一区二区三区四区亚洲| 久久久久久影视| 91精品一区二区三区在线观看| 99久久久国产精品| 国产福利精品导航| 久久99国产精品成人| 午夜精品久久久久久不卡8050| 亚洲欧洲色图综合| 中文字幕精品一区二区三区精品|