gdb除錯多程序

2021-07-27 23:15:02 字數 1226 閱讀 4510

gdb 是 linux 系統上常用的 c/c++ 除錯工具,功能十分強大。對於較為複雜的系統,比如多程序系統,如何使用 gdb 除錯呢?

實際上,gdb 沒有對多程序程式除錯提供直接支援。例如,使用gdb除錯某個程序,如果該程序fork了子程序,gdb會繼續除錯該程序,子程序會不受干擾地執行下去。如果你事先在子程序**裡設定了斷點,子程序會收到sigtrap訊號並終止。那麼該如何除錯子程序呢?其實我們可以利用gdb的特點或者其他一些輔助手段來達到目的。此外,gdb 也在較新核心上加入一些多程序除錯支援。

follow-fork-mode的用法為:

set follow-fork-mode [parent|child]

parent: fork之後繼續除錯父程序,子程序不受影響。

child: fork之後除錯子程序,父程序不受影響。

因此如果需要除錯子程序,在啟動gdb後:

(gdb) set follow-fork-mode child
並在子程序**設定斷點。

此外還有detach-on-fork引數,指示gdb在fork之後是否斷開(detach)某個程序的除錯,或者都交由gdb控制:

set detach-on-fork [on|off]

on: 斷開除錯follow-fork-mode指定的程序。

off: gdb將控制父程序和子程序。follow-fork-mode指定的程序將被除錯,另乙個程序置於暫停(suspended)狀態。

follow-fork-mode/detach-on-fork的使用還是比較簡單的,但由於其系統核心/gdb版本限制,我們只能在符合要求的系統上才能使用。而且,由於follow-fork-mode的除錯必然是從父程序開始的,對於fork多次,以至於出現孫程序或曾孫程序的系統。

眾所周知,gdb有附著(attach)到正在執行的程序的功能,即attach 命令。因此我們可以利用該命令attach到子程序然後進行除錯。

其基本原理是以gdb呼叫待執行**作為乙個新的整體來被exec函式執行,使得待執行**始終處於gdb的控制中,這樣我們自然能夠除錯該子程序**。

gdb多程序除錯

使用gdb最好的文件就是其名為 debugging with gdb 的參考手冊。手冊中有一小章節提到了如何除錯多程序程式。一般情況下,如果被gdb除錯的程式中呼叫fork派生出乙個新的子程序,這時gdb除錯的仍然還是父程序,其子程序的執行不被理會。如果之前你在子程序的執行routine上設定了斷點...

gdb除錯多程序

在大多數系統,gdb對使用fork建立的程序沒有進行特別的支援。當父程序使用fork建立子程序,gdb仍然只會除錯父程序,而子程序沒有得到控制和除錯。這個時候,如果你在子程序執行到的 中設定了斷點,那麼當子程序執行到這個斷點的時候,會產生乙個sigtrap的訊號,如果沒有對此訊號進行捕捉處理,就會按...

GDB多程序除錯

使用 gdb 除錯的時候,gdb 預設只能跟蹤乙個程序,可以在 fork 函式呼叫之前,通過指令設定 gdb 除錯工具跟蹤父程序或者是跟蹤子程序,預設跟蹤父程序。設定除錯父程序或者子程序 set follow fork mode parent 預設 child 設定除錯模式 set detach o...