如何让 Check 生成核心转储?
How to make Check generate a core dump?
我有一个单元测试(使用 Check)崩溃了。如何生成核心转储以便进行调试?
$ make check
.
.
.
XXX.c:216:E:Core:test01XXX:0: (after this point) Received signal 11 (Segmentation fault)
(第216行只是test01XXX的开始,不是实际的代码行)
试过ulimit -c unlimited
但是没有核心文件
编辑:我认为这不是一般编写核心文件或在磁盘上找到它的问题。从同一目录,我可以 kill -SEGV
一个进程,它将生成一个核心文件:
$ ls core*
ls: cannot access core*: No such file or directory
$ cat crash.c
int main()
{
return *(int *)0;
}
$ gcc -o crash crash.c
$ ./crash
Segmentation fault (core dumped)
$ ls core*
core.121934
我认为问题在于 Check 捕获了 SIGSEGV,我只需要以某种方式对其进行不同的配置。
从 什么是检查? 部分 front page,它默认为 运行 测试 "in a separate address space"(即,在儿童中process),所以他们不能破坏单元测试框架本身。
然而,No Fork Mode正是出于这个原因而提供的:
However, when you are trying to debug why the segmentation fault or other program error occurred, forking makes it difficult to use debugging tools
在解决此崩溃问题时设置或导出 CK_FORK=no
。
如果您发现某个测试应该始终为您提供失败的核心,您可以使用
以编程方式控制它
srunner_set_fork_status (..., CK_NOFORK);
我有一个单元测试(使用 Check)崩溃了。如何生成核心转储以便进行调试?
$ make check
.
.
.
XXX.c:216:E:Core:test01XXX:0: (after this point) Received signal 11 (Segmentation fault)
(第216行只是test01XXX的开始,不是实际的代码行)
试过ulimit -c unlimited
但是没有核心文件
编辑:我认为这不是一般编写核心文件或在磁盘上找到它的问题。从同一目录,我可以 kill -SEGV
一个进程,它将生成一个核心文件:
$ ls core*
ls: cannot access core*: No such file or directory
$ cat crash.c
int main()
{
return *(int *)0;
}
$ gcc -o crash crash.c
$ ./crash
Segmentation fault (core dumped)
$ ls core*
core.121934
我认为问题在于 Check 捕获了 SIGSEGV,我只需要以某种方式对其进行不同的配置。
从 什么是检查? 部分 front page,它默认为 运行 测试 "in a separate address space"(即,在儿童中process),所以他们不能破坏单元测试框架本身。
然而,No Fork Mode正是出于这个原因而提供的:
However, when you are trying to debug why the segmentation fault or other program error occurred, forking makes it difficult to use debugging tools
在解决此崩溃问题时设置或导出 CK_FORK=no
。
如果您发现某个测试应该始终为您提供失败的核心,您可以使用
以编程方式控制它srunner_set_fork_status (..., CK_NOFORK);