ptrace 跟蹤多執行緒程式

2021-06-18 11:33:11 字數 3513 閱讀 3684

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等。關於這些...