# include <stdlib.h>
.
.
.
static void myExitHandler( void )
{
write( STDERR_FILENO, "in exit handler\n",
strlen( "in exit handler\n" ) );
}
在您的main()中:
atexit( myExitHandler );
然后,您应该能够在myExitHandler()中设置断点,并且它应该在进程退出时被触发。 如果你需要在不使用gdb的情况下通过编程获取所有线程的回溯,如果你的程序跟踪它的线程(它肯定应该...),你可以将线程id传递给你的退出处理程序,并使用类似libunwind的东西来获取回溯。请参见Getting a backtrace of other thread来获取一些方法。 但是正如注解中所指出的,如果线程实际上正在工作,简单地完全退出进程可能会导致数据损坏等问题。
1条答案
按热度按时间ylamdve61#
从
main()
返回并不保证调用exit()
或_exit()
。这是C标准中没有涉及的内部实现细节。您可以使用
atexit()
添加退出处理程序函数,然后在该函数中设置gdb
断点。在您的
main()
中:然后,您应该能够在
myExitHandler()
中设置断点,并且它应该在进程退出时被触发。如果你需要在不使用
gdb
的情况下通过编程获取所有线程的回溯,如果你的程序跟踪它的线程(它肯定应该...),你可以将线程id传递给你的退出处理程序,并使用类似libunwind
的东西来获取回溯。请参见Getting a backtrace of other thread来获取一些方法。但是正如注解中所指出的,如果线程实际上正在工作,简单地完全退出进程可能会导致数据损坏等问题。