我正在尝试为我的C应用程序使用check单元测试框架。但由于以下两个问题,我无法使用调试器(gdb):
首先,check使用了一些复杂的宏(
START_TEST
和END_TEST
),调试器很难在这两个宏之间的代码中设置断点(实际上,我可以设置一个软件断点,但gdb从未看到它)。其次,check通过重新定义中断行为来定义某种异常。因此,当我尝试设置硬件断点时,测试失败并退出,因为check认为硬件断点是测试失败。
是否有人遇到过这个问题并且有解决方案?
我正在尝试为我的C应用程序使用check单元测试框架。但由于以下两个问题,我无法使用调试器(gdb):
首先,check使用了一些复杂的宏(START_TEST
和END_TEST
),调试器很难在这两个宏之间的代码中设置断点(实际上,我可以设置一个软件断点,但gdb从未看到它)。
其次,check通过重新定义中断行为来定义某种异常。因此,当我尝试设置硬件断点时,测试失败并退出,因为check认为硬件断点是测试失败。
是否有人遇到过这个问题并且有解决方案?
看看无分叉模式:
通常情况下,Check会分叉以创建一个独立的地址空间。这允许捕获和报告信号或提前退出,而不是使整个测试程序崩溃,通常非常有用。然而,当你试图调试为什么发生段错误或其他程序错误时,分叉会使使用调试工具变得困难。
实际上,您也可以使用fork模式。
gdb有两个与fork行为相关的有趣选项:
- detach-on-fork
(将其设置为false)
- follow-on-fork
(父进程或子进程;我总是选择子进程)
这将使gdb跟踪子进程。
当子进程结束时,您必须使用inferior
命令手动切回父进程。
我看了这篇文章,他提出了一个非常简单的解决方案:
gdb > set environment CK_FORK=no
这对我很有帮助。我可以在测试用例调用的函数(即受测试的函数)中设置断点,它会在正确的位置中断。