引用:
----------------------------------------------------------------------------------------------------
原始海报:
我编写了一个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命令发送的信号则直接发送给被调试程序。
===================