2016-06-18 30 views
1

在調試會話中,當deugger想要設置斷點時,它將用int3替換指令。當目標進程達到該指令時,進程停止。我已經讀過這個時候發送了一個信號。但我沒有設法捕獲這個信號(我寫了我自己的微型調試器進行測試)。誰發送這個信號?內核?誰是接收者? 我不得不在ptrace_cont後面加入wait()函數。你認爲這是這個等待函數捕獲信號以通知調試器該進程到達一箇中斷點嗎?在interupt 3的情況下,誰發送和誰發佈SIGTRAP?

回答

1

當目標進程到達該指令時,進程停止。

這不太準確。當執行陷阱指令(x86上的0xCC)時,處理器會通知操作系統。在UNIX上,操作系統檢查某人是否正在進行ptrace d。

如果否,SIGTRAP信號被傳送到應用程序,這通常會導致進程被終止(但您可以捕獲並處理應用程序中的信號)。

如果有一個ptrace ER(通常是一個調試器),然後將信號不傳遞給應用程序。相反,調試器的wait將被解除阻止,以通知調試器劣質狀態已更改。然後調試器查看劣質進程停止的位置,發現它是由於斷點而執行的,並根據情況處理情況(讓我們檢查劣勢,或者在斷點是有條件且當前條件不匹配的情況下繼續執行)等)