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