gdb時發出SIGTRAP訊號的處理

2021-07-10 05:52:34 字數 1353 閱讀 5281

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

當然,你可以使用時間延遲的方法,在子程序fork出來之後,使用sleep函式等待一段時間再執行,在這段時間中你使用ps找到該程序,然後使用attach方法把該程序附加到gdb中,從而達到可以除錯子程序的目的。

在一部分系統中(我使用的是基於2.6核心的centos,支援follow-fork和detach-on-fork模式),比如hp-ux11.x之後的版本,linux2.5.60之後的版本,可以使用以下的方法來達到方便的進行多程序除錯功能。

預設情況下,父程序fork乙個子程序,gdb只會繼續除錯父程序而不會管子程序的執行。

如果你想跟蹤子程序進行除錯,可以使用set follow-fork-mode mode來設定fork跟隨模式。

set follow-fork-mode 所帶的mode引數可以是以下的一種:

parent

gdb只跟蹤父程序,不跟蹤子程序,這是預設的模式。

child

gdb在子程序產生以後只跟蹤子程序,放棄對父程序的跟蹤。

進入gdb以後,我們可以使用show follow-fork-mode來檢視目前的跟蹤模式。

可以看到目前使用的模式是parent。

然而,有的時候,我們想同時除錯父程序和子程序,以上的方法就不能滿足了。linux提供了set detach-on-fork mode命令來供我們使用。其使用的mode可以是以下的一種:

on只除錯父程序或子程序的其中乙個(根據follow-fork-mode來決定),這是預設的模式。

off父子程序都在gdb的控制之下,其中乙個程序正常除錯(根據follow-fork-mode來決定)

另乙個程序會被設定為暫停狀態。

同樣,show detach-on-fork顯示了目前是的detach-on-fork模式,如上圖。

以上是除錯fork產生子程序的情況,但是如果子程序使用exec系統函式而裝載了新程式執行呢?——我們使用set follow-exec-mode mode提供的模式來跟蹤這個exec裝載的程式。mode可以是以下的一種:

new 當發生exec的時候,如果這個選項是new,則新建乙個inferior給執行起來的子程序,而父程序的inferior仍然保留,當前保留的inferior的程式狀態是沒有執行。

same 當發生exec的時候,如果這個選項是same(預設值),因為父程序已經退出,所以自動在執行exec的inferior上控制子程序。

發出訊號 孩子發脾氣,其實是在向我們發出訊號

朋友打來 急促地問道 我兒子是否來你家了?當得知不在我家時,她崩潰地大哭,6歲的兒子離家出走了。原來,因為受疫情影響,只能在家辦公,正好邊帶孩子邊忙手頭的工作。臨近午飯時,她還在電腦前忘我地與同事商討方案,餓了的兒子跑過來不停地晃媽媽的腿,剛開始媽媽還用零食哄著。可一會兒,兒子連哭帶鬧地又跑過來纏住...

Gdb 除錯訊號

gdb有能力在你除錯程式的時候處理任何一種訊號,你可以告訴gdb需要處理哪一種訊號。你可以要求gdb收到你所指定的訊號時,馬上停住正在執行的程式,以供你進行除錯。你可以用gdb的handle命令來完成這一功能。handle 在gdb中定義乙個訊號處理。訊號可以以sig開頭或不以sig開頭,可以用定義...

vue 發出請求時帶token

目前我用的介面都是前期不需要token。所以我先把token寫死 1 首先安裝axios npm install axios2 在main.js中引入axios import axios from axios vue.prototype.axios axios3 在main,js中引入token 加...