[英]how does gdb attach to multithread process
當我們使用gdb attach
調試正在運行的進程時,可以使用gdb attach pid
,如果該進程有兩個或多個線程,則pid是主線程tid。
現在,我想實現一個簡單的調試器來調試多線程進程,但是當我使用調試器附加多線程進程時,只有main thread
掛起。
我想知道為什么只使用主線程tid, gdb
可以附加該進程的所有線程,gdb如何掛起所有線程? 我們假設使用gdb attach
,所有線程都已創建。
ptrace PTRACE_ATTACH
將SIGSTOP
發送到該進程,該進程將掛起整個進程,即所有線程。
我想知道為什么只使用主線程tid,gdb可以附加該進程的所有線程,gdb如何掛起所有線程?
當您attach PROCESS_PID
gdb
內部為每個線程調用ptrace(PTRACE_ATTACH)。 在Linux上,您可以自己檢查:
$ strace -e ptrace -p GDB_PROCESS_PID
只需運行具有幾個線程的程序,運行gdb,然后在另一個控制台中運行attach PROCESS_PID之前運行strace。 您必須為每個線程看到ptrace(PTRACE_ATTACH)。
具有與進程PID相同數值的主線程TID是Linux系統的歷史事故; 在其他Unix系統上則不是這樣。
當gdb(或任何調試器)使用ptrace附加到進程時,該進程的所有線程都將被掛起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.