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