更新時(shí)間:2024-07-19 15:09:39作者:佚名
引用:
----------------------------------------------------------------------------------------------------
原始海報(bào):
我編寫了一個(gè)INT信號(hào)的處理函數(shù),在處理函數(shù)中設(shè)置斷點(diǎn)并點(diǎn)擊Go,但是按Ctrl-C之后,MC并沒有進(jìn)入處理函數(shù),程序直接退出,沒有給出預(yù)期的輸出。
----------------------------------------------------------------------------------------------------
按下Ctrl-C之后確實(shí)會(huì)發(fā)送信號(hào),但是gdb中的默認(rèn)設(shè)置會(huì)導(dǎo)致該信息被GDB截獲信號(hào) signal,被調(diào)試的應(yīng)用程序?qū)⑹詹坏皆撔盘?hào)。
有兩種方法可以使被調(diào)試的應(yīng)用程序接收信號(hào):
(1)改變gdb信號(hào)處理的設(shè)置
例如信號(hào) signal,以下設(shè)置將告訴 gdb 在收到以下信息時(shí)不要停止、打印或傳遞給目標(biāo)程序:
(2)使用gdb命令直接向被調(diào)試的應(yīng)用程序發(fā)送信號(hào)
首先在需要發(fā)送信號(hào)的語(yǔ)句處設(shè)置斷點(diǎn),然后運(yùn)行程序,當(dāng)程序停在斷點(diǎn)處時(shí),使用gdb命令向調(diào)試目標(biāo)程序發(fā)送信號(hào)。
;-( 不過(guò)MC暫時(shí)還不支持這兩種方式,所以你們的調(diào)試情況還是等MC新版本能方便的支持吧,哈哈,暫時(shí)還是手動(dòng)調(diào)試吧。
新版本將添加
(1)調(diào)試器的信號(hào)處理設(shè)置
(2)支持發(fā)送信號(hào)命令
調(diào)試用例:
============
更改 gdb 的信號(hào)處理設(shè)置
============
5.3
事件 A 是可以發(fā)生的事件。事件的種類有 ,并且為每種事件賦予一個(gè)名稱和一個(gè) 。例如,在 Unix 中,事件 A 是當(dāng)您鍵入 (通常是 Cc)時(shí)獲取的事件;事件 A 是從遠(yuǎn)離所有正在使用的區(qū)域的某個(gè)地方獲取的事件;當(dāng)鬧鐘計(jì)時(shí)器響起時(shí)(僅當(dāng)您有鬧鐘時(shí))。
有些 , , 是 的一部分,例如 , ;如果 還沒有以其他方式 到達(dá) ,這些是致命的(它們會(huì)殺死你的 ),但它是致命的貝語(yǔ)網(wǎng)校,因此它可以執(zhí)行 : 來(lái)殺死 。
GDB 可以對(duì)你的 中的任何一種 進(jìn)行處理。你可以告訴 GDB 對(duì)每種 進(jìn)行什么處理。
,GDB 的設(shè)置是讓非類屬對(duì)象進(jìn)入你的程序(這樣就不會(huì)影響它們?cè)诔绦蛑械淖饔茫珪?huì)阻止你出錯(cuò)。你可以使用 來(lái)執(zhí)行這些。
信息
信息
打印所有類型的表格以及 GDB 已告知每種類型的表格。您可以使用它來(lái)查看所有類型的 。
info 是 info 的別名。
...
GDB 的方式。可以是 或其名稱(在 處帶有 或 'SIG'); 形式為 'low-high' 的 列表;或單詞 'all',所有已知的 。 說(shuō)明要做什么。
的全名是:
當(dāng)出現(xiàn)這種情況時(shí),GDB 不會(huì)停止您的操作。它仍可能會(huì)打印一條消息,告知您已進(jìn)入。
停止
當(dāng)出現(xiàn)這種情況時(shí),GDB 會(huì)停止您的操作。這也是打印。
打印
當(dāng)出現(xiàn)這種情況時(shí),GDB 會(huì)打印一個(gè)。
GDB 根本不是。這也是。
經(jīng)過(guò)
GDB 允許您看到這一點(diǎn);您可以,否則可能如果是致命的并且不是。通過(guò)并且是。
GDB 不允許您看到這個(gè)。并且是。
當(dāng) a 停止你的 時(shí), 直到你 才會(huì) 。 你看到 然后,如果 pass 處于 中,則在那時(shí)。 換句話說(shuō),在 GDB a 之后,你可以使用 pass 或 直到你 看到 當(dāng)??你 。
將 設(shè)置為 , ,對(duì)于非例如 ,和 ,則傳遞 ,并停止打印 ,對(duì)于 ,則傳遞 。
您還可以使用 來(lái)從 中獲取 ,或使其看到它看不到的 ,或隨時(shí)賦予它 任何 。對(duì)于 ,如果您的 由于某種錯(cuò)誤,您可能會(huì)將 存儲(chǔ)到 和 中以查看更多;但一旦它看到 ,您的 就會(huì)被視為 的致命錯(cuò)誤。為此,您可以使用“0”。查看您的 。
============
使用gdb命令直接向調(diào)試目標(biāo)程序發(fā)送信號(hào)
================
3. 產(chǎn)生信號(hào)
使用命令可以給被調(diào)試的程序產(chǎn)生一個(gè)信號(hào),比如中斷信號(hào)Ctrl+C。這對(duì)于程序的調(diào)試非常方便。你可以在程序的任意位置設(shè)置斷點(diǎn),使用GDB在斷點(diǎn)處產(chǎn)生信號(hào)。這種精確的信號(hào)產(chǎn)生對(duì)于程序的調(diào)試非常有利。
語(yǔ)法為:;,UNIX系統(tǒng)信號(hào)通常范圍是1到15。所以;的值也在這個(gè)范圍內(nèi)。
命令的kill命令與shell的kill命令有所不同,當(dāng)系統(tǒng)kill命令向被調(diào)試程序發(fā)送信號(hào)時(shí),會(huì)被GDB截獲,而kill命令發(fā)送的信號(hào)則直接發(fā)送給被調(diào)試程序。
===================
2024-07-19 11:12
2024-07-19 10:11