2010-08-19 71 views
3

我有一個類似「調試器」的應用程序,名爲hyper-ptrace。它啓動了與NPTL多線程的user_appl3ptrace'ing多線程應用程序

超ptrace的的主迴路爲:在爲每個線程一些週期間隔爲user_appl3生成由硬件

wait3(&status, FLAGS, &u); 
// find a pid of child, which has a signal 
switch (signal = WSTOPSIG(status)) 
{ 
    case SIGTRAP: 
    do_some_analysis_of_the_child(pid, &status) // up to several ms 
    break; 
} 
ptrace(PTRACE_CONT, pid); // discard signal, user_appl3 doesn't know anything 
          //about this SIGTRAP 

的SIGTRAP和被遞送到某個線程的。間隔可以是100..1毫秒或更少。 這是一種具有中斷的每CPU時鐘。每個線程僅在其CPU上運行(與綁定綁定)。

於是就有了問題1

如果線程1得到了TRAP和調試器進入到do_some_analysis_of_the_child,(所以調試器不會做第二個線程wait3),有點時間後,線程2 GOTS TRAP過,是什麼將由Linux內核完成?

在我看來:thread1將被停止,因爲它得到一個信號,並有一個等待調試器。但thread2繼續運行(是嗎?)。當thread2得到一個信號時,不會有一個等待調試器,所以TRAP可以傳遞給thread2本身,從而有效地殺死它。 我對不對?

而且還有第二個問題,問題2

對於這種情況,我應該怎麼改寫hyper-ptrace主循環降低通過傳遞信號給用戶的線程的機會,在調試器上? 既不能生成陷阱硬件也不能更改用戶應用程序。停止第二個線程也不是一個變體。

我需要分析兩個線程。有些部分只能在線程停止時才能完成。

在此先感謝!

+0

sigtrap這裏可以從斷點到沒有極端硬件TRAP發生器。 – osgx 2010-08-19 16:06:56

回答

5

不,信號沒有傳送到應用程序。當信號發生時,子應用程序將停止,並且您的ptracing進程將在下次調用 wait()時收到通知。

你是對的 - 跟蹤停止只適用於主線程。

爲了得到你想要的行爲,暫停整個子進程(每個線程)跟蹤的線程通過發送SIGSTOP到進程PID停止後,用SIGCONT恢復它時,你就大功告成了:

wait3(&status, FLAGS, &u); 

if (WIFSTOPPED(status)) 
    kill(pid, SIGSTOP); /* Signal entire child process to stop */ 

switch (signal = WSTOPSIG(status)) 
{ 
    case SIGTRAP: 
    do_some_analysis_of_the_child(pid, &status) // up to several ms 
    break; 
} 

ptrace(PTRACE_CONT, pid, 0, 0); // discard signal, user_appl3 doesn't know anything about this SIGTRAP 
kill(pid, SIGCONT); /* Signal entire child process to resume */ 
+0

在我的情況下,用戶應用程序由2個線程組成。你能提供鏈接到線程案例的源代碼或文檔嗎? – osgx 2010-08-20 08:20:12

+0

@osgx:*全部進程*,表示所有線程,將在收到信號後停止。無論何時POSIX文檔說某個進程發生了某些事情(例如「進程停止」),它都在討論多線程情況下的整個進程。如果文檔意味着只有一個線程受到影響,它總是這樣說。 – caf 2010-11-09 04:19:19

+0

@caf:我不認爲你最後的評論是正確的。我在Linux上的所有實驗都表明,如果一個線程在linux上接收到事件,則另一線程繼續正常工作,並由調試器手動停止所有其他線程。它可能與其他操作系統(如* BSD系列)不同,但在Linux上,每個線程都是一個進程,必須單獨進行。 – 2010-12-01 02:46:05