首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >谁打电话给atexit()?

谁打电话给atexit()?
EN

Stack Overflow用户
提问于 2014-10-08 12:32:40
回答 2查看 2K关注 0票数 2

我有一个在Linux上意外退出的C程序,我很难找出原因(没有核心转储,参见XIO: fatal IO error 11)。我在程序的开头放置了一个atexit(),当崩溃发生时,回调函数确实会被调用。

我如何知道什么叫atexit回调函数?从读取手册页,atexit被称为退出(d‘’ho!)或者从梅因回来。我可以排除后者,因为在主目录的末尾有一堆printf,但我没有看到它们。我可以将前者排除在外,因为我的程序中没有exit()。

这只剩下一个解决方案:从库函数中调用exit。这是唯一的可能吗?我怎么能从哪里知道呢?是否可以打印堆栈跟踪或强制从atexit回调中强制核心转储?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-08 13:14:10

例如,在atexit处理程序中调用abort(),并检查gdb中的coredump。如果运行atexit处理程序,gdb回溯跟踪命令将显示它退出的位置。下面是一个演示:

代码语言:javascript
复制
#include <stdlib.h>


void exit_handler(void)
{
    abort();
}

void startup()
{
#ifdef DO_EXIT
    exit(99);
#endif
}


int main(int argc, char *argv[])
{
    atexit(exit_handler);

    startup();

    return 0;
}

这样做:

代码语言:javascript
复制
$ gcc -DDO_EXIT -g atexit.c
$ ulimit -c unlimited
$ ./a.out
Aborted (core dumped)
$ gdb ./a.out core.28162
GNU gdb (GDB) Fedora 7.7.1-19.fc20
..
Core was generated by `./a.out'.
Program terminated with signal SIGABRT, Aborted.
#0  0xb77d7424 in __kernel_vsyscall ()
Missing separate debuginfos, use: debuginfo-install glibc-2.18-16.fc20.i686
(gdb) bt
#0  0xb77d7424 in __kernel_vsyscall ()
#1  0x42e1a8e7 in raise () from /lib/libc.so.6
#2  0x42e1c123 in abort () from /lib/libc.so.6
#3  0x0804851b in exit_handler () at atexit.c:6
#4  0x42e1dd61 in __run_exit_handlers () from /lib/libc.so.6
#5  0x42e1ddbd in exit () from /lib/libc.so.6
#6  0x0804852d in startup () at atexit.c:12
#7  0x08048547 in main (argc=1, argv=0xbfc39fb4) at atexit.c:21

正如预期的那样,它显示了调用exit的startup()。

当然,您也可以交互式地调试这一点,在gdb中启动您的程序,并在atexit处理程序中设置一个断点。

票数 7
EN

Stack Overflow用户

发布于 2014-10-08 12:55:44

标准只写“在正常程序终止时”,所以在Linux上,这可能比exitmainreturn还要多。您还忘记了pthread_exit,它也可能终止main的线程,从而终止整个程序。

在任何情况下,都无法从发出终止通知的地点立即看到。atexit处理程序通常由初始化函数调用。根据定义,所有其他应用程序代码,但atexit处理程序在这一点上消失了。

您可以尝试通过调试器跟踪执行,而不是确定终止发生的位置。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26256996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档