【发布时间】:2015-11-16 20:01:20
【问题描述】:
假设我有以下 C 代码:
static void handler(int sig, siginfo_t *si, void *unused)
{
printf("BOOM!\n");
//another segfault here
exit(-1);
}
int main(int argc, char *argv[])
{
struct sigaction sa;
sa.sa_flags = SA_SIGINFO;
sigemptyset(&sa.sa_mask);
sa.sa_sigaction = handler;
if (sigaction(SIGSEGV, &sa, NULL) == -1)
perror("failed to set handler");
// call other stuff here, somewhere in the callstack a segfault happens
}
如果执行遇到第一个分段错误,则将触发处理程序。但是当处理程序本身由于某种原因发生分段错误时会发生什么?它会用新的siginfo_t 再次调用处理程序还是会立即终止程序?
如果再次调用处理程序会这样工作:
int in_handler = 0;
static void handler(int sig, siginfo_t *si, void *unused)
{
printf("BOOM!\n");
if(!in_handler)
{
in_handler = 1;
//code that could possibly segfault
} else {
//totally safe code
}
exit(-1);
}
我问的原因是我目前正在用 C 语言编写某种单元测试框架。如果测试用例由于某些非法内存访问而失败,我想将所有剩余的测试标记为失败。如果由于某种原因测试严重破坏了堆,则此操作可能会失败,因为我必须遍历数据结构并将该信息写入 xml 文件。但是,如果将所有剩余的测试标记为失败,我仍然希望保留哪些测试是失败的信息。
【问题讨论】:
-
我建议在分叉进程中运行每个测试,并在父进程中检索终止状态。这将允许您不丢弃所有剩余的测试,并能够明确报告子段错误。
标签: c unit-testing segmentation-fault posix