linux 是否可以在应用程序退出时获得回溯跟踪?

kgsdhlau  于 2022-11-02  发布在  Linux
关注(0)|答案(1)|浏览(118)

我有一个linux(ARM)多线程应用程序。我如何在退出时(而不是崩溃时)获取应用程序的回溯(针对所有线程)。注意:我不能将gdb与catch syscall一起使用,因为不支持该特性的体系结构。
我尝试在退出和_exit时使用gdb设置断点,但没有成功。

ylamdve6

ylamdve61#

main()返回并不保证调用exit()_exit()。这是C标准中没有涉及的内部实现细节。
您可以使用atexit()添加退出处理程序函数,然后在该函数中设置gdb断点。


# 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来获取一些方法。
但是正如注解中所指出的,如果线程实际上正在工作,简单地完全退出进程可能会导致数据损坏等问题。

相关问题