我有一個類似「調試器」的應用程序,名爲hyper-ptrace
。它啓動了與NPTL多線程的user_appl3
。ptrace'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
主循環降低通過傳遞信號給用戶的線程的機會,在調試器上? 既不能生成陷阱硬件也不能更改用戶應用程序。停止第二個線程也不是一個變體。
我需要分析兩個線程。有些部分只能在線程停止時才能完成。
在此先感謝!
sigtrap這裏可以從斷點到沒有極端硬件TRAP發生器。 – osgx 2010-08-19 16:06:56