1.ptrace 原型說明
#include long ptrace(enum __ptrace_requestrequest, pid_tpid, void *addr, void *data);在使用ptrace_traceme引數時,跟蹤多執行緒程式需要使用ptrace_setoptions來設定ptrace相關屬性。
ptrace_setoptions 是將父程序內由data指向的值設定為ptrace 選項,data作為掩碼來解釋,由下面的標誌來指定:
(1) ptrace_o_exitkill:當跟蹤程序退出時,向所有被跟蹤程序傳送sigkill訊號將其退出,這個引數可以防止被跟蹤程序脫離跟蹤程序的控制。
(2) ptrace_o_traceclone:被跟蹤程序在下一次呼叫clone()時將其停止,並自動跟蹤新產生的程序,新產生的程序剛開始收到sigstop訊號。其新產生的程序的pid可以
通過ptrace_geteventmsg得到。
(3) ptrace_o_traceexec:被跟蹤程序在下一次呼叫exec()函式時使其停止。
(4) ptrace_o_traceexit:被跟蹤程序在退出是停止其執行,被跟蹤程序的退出狀態可通過ptrace_geteventmsg獲得。
(5) ptrace_o_tracefork:被跟蹤程序在下次呼叫fork()時停止執行,並自動跟蹤新產生的程序,新產生的程序剛開始收到sigstop訊號。其新產生的程序的pid可以
通過ptrace_geteventmsg得到。
(6) ptrace_o_tracevfork:被跟蹤程序在下次呼叫vfork()時停止執行,並自動跟蹤新產生的程序,新產生的程序剛開始收到sigstop訊號。其新產生的程序的pid可以
通過ptrace_geteventmsg得到。
ptrace_geteventmsg:獲取剛剛發生的ptrace事件訊息,並存放在跟蹤程序由data指向的位置,addr引數被忽略。對於
ptrace_event_fork,ptrace_event_vfork,ptrace_event_vforkdown和ptrace_event_clone,data是新程序的pid.
2. 使用ptrace進行跟蹤多執行緒程式時將要使用上述所涉及的知識進行編碼,其被跟蹤程式如下:
/** ex1.c
** this program is child process traced by ptrace_example
** created on: sep 23, 2013
* author: administrator
*/#include
#include
#include
#include
#include
#include
#include
#include
void *thread_function(void *arg);
char message = "hello";
int main()
printf("wait for thread to finish...\n");
res = pthread_join(a_thread, &thread_result);
if (res != 0)
printf("thread joined, it returned %s\n", (char *) thread_result);
exit(exit_success);
}void *thread_function(void *arg)
上述程式就是基於posix的簡單的多執行緒程式,主線程建立子執行緒,等待子執行緒的結束,獲取子執行緒結束時的退出狀態,然後主線程結束。
現在我們來看一下跟蹤程序的**:
/** ptrace_example.c
** this program is to trace multi-thread program
** created on: sep 23, 2013
* author: administrator
*/#include
#include
#include
#include
#include
#include
#include
#include
int main()
else
if (wifsignaled(status))
if (wifstopped(status) && wstopsig(status) == sigstop)
if (wifstopped(status) && wstopsig(status) == sigtrap)}}
if (child_waited == -1)
break;
if (wifexited(status))
ptrace(ptrace_cont, child_waited, 1, null);}}
return 0;
}被跟蹤程序首先是使用fork()系統呼叫建立子程序,然後使用exec載入被跟蹤程式ex,通過exec函式族載入時,會是被跟蹤程序收到sigtrap訊號使其終止,而跟蹤程序會收到sigchld訊號。在被跟蹤程序裡面首先使用wait(null)忽略這乙個訊號,然後設定ptrace屬性,使其跟蹤clone事件,此時,當被跟蹤程序呼叫pthread_create時,將使其停止執行,轉而執行新產生的子執行緒,並且子執行緒因為sigtrap停止執行,這個時候事件觸發,跟蹤程序得到該訊號,分析ptrace_event_clone事件,並且使用ptrace_geteventmsg來得到新產生的子執行緒的pid,最後兩個子執行緒結束退出時想跟蹤程序傳送sigexit訊號.
程式執行如下:
使用gcc -g ec.c -o ex -lpthread 編譯被跟蹤程序
使用gcc -g ptrace_example.c -o ptrace_example 編譯跟蹤程序
./ptrace_example執行跟蹤程序程式,執行結果如下:
administrator@ubuntu:~/workspace/tools/src$ ./ptrace_example_11
child 3574 recvied signal 19
child 3573 recvied signal 5
thread 3574 created
wait for thread to finish...
thread_function is running ,argument was hello
thread joined, it returned thank you for the cpu time
thread 3574 exited with status 0
thread 3573 exited with status 0
至此,ptrace完成了跟蹤乙個簡單多執行緒程式的功能。
linux之使用ptrace 跟蹤多執行緒程式
1.ptrace 原型說明 include long ptrace enum ptrace requestrequest,pid tpid,void addr,void data 在使用ptrace traceme引數時,跟蹤多執行緒程式 需要使用ptrace setoptions來設定ptrace...
python程式多執行緒 PYTHON多執行緒
在單執行緒的情況下,程式是逐條指令順序執行的。同一時間只做乙個任務,完成了乙個任務再進行下乙個任務。比如有5個人吃飯,單執行緒一次只允許乙個人吃,乙個人吃完了另乙個人才能接著吃,假如每個人吃飯都需要1分鐘,5個人就需要5分鐘。多執行緒的情況下,程式就會同時進行多個任務,雖然在同一時刻也只能執行某個任...
多執行緒程式debug linux
多執行緒程式可能存在很多潛在的bug,如data race,dead lock,訊號bug等,而這些bug一向很難除錯,現在有很多 都是基於多執行緒程式的除錯技術的,比如model check,死鎖檢測,replay技術等,也有很多對應的工具,如intel的pinplay,微軟的zing等。關於這些...