使用check在C语言中调试单元测试

9

我正在尝试为我的C应用程序使用check单元测试框架。但由于以下两个问题,我无法使用调试器(gdb):

  • 首先,check使用了一些复杂的宏(START_TESTEND_TEST),调试器很难在这两个宏之间的代码中设置断点(实际上,我可以设置一个软件断点,但gdb从未看到它)。

  • 其次,check通过重新定义中断行为来定义某种异常。因此,当我尝试设置硬件断点时,测试失败并退出,因为check认为硬件断点是测试失败。

是否有人遇到过这个问题并且有解决方案?

4个回答

12

看看无分叉模式

通常情况下,Check会分叉以创建一个独立的地址空间。这允许捕获和报告信号或提前退出,而不是使整个测试程序崩溃,通常非常有用。然而,当你试图调试为什么发生段错误或其他程序错误时,分叉会使使用调试工具变得困难。


7

实际上,您也可以使用fork模式。

gdb有两个与fork行为相关的有趣选项:
- detach-on-fork(将其设置为false)
- follow-on-fork(父进程或子进程;我总是选择子进程)

这将使gdb跟踪子进程。 当子进程结束时,您必须使用inferior命令手动切回父进程。


4

我看了这篇文章,他提出了一个非常简单的解决方案:

gdb > set environment CK_FORK=no

这对我很有帮助。我可以在测试用例调用的函数(即受测试的函数)中设置断点,它会在正确的位置中断。


0

试一下 TAP(测试任何协议)……它更容易实现、发布和调试。而且非常容易让它支持 valgrind,并且倾向于与 gdb 更加兼容。


截至2016年9月23日,到http://ccan.ozlabs.org/info/tap.html的TAP链接是404。主要网站ozlabs.org仍在运行,但我找不到TAP信息。维基百科有一个Test Anything Protocol条目;有一个Test Anything Protocol网站,其中包括C、C++、Java、JavaScript、Python、Perl等实现。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接