_exit断点“错过”有两个常见的原因 – GDB没有将断点设置在正确的位置,或者程序执行(道德上等同于)syscall(SYS_exit,…)
什么信息打破和拆卸_exit说?
您可能可以说服GDB使用break *& _exit正确设置断点.或者,GDB-7.0支持catch系统调用.这样的东西应该可以工作(假设Linux / x86_64;请注意,在ix86上的数字将会不同),无论程序如何退出:
(gdb) catch syscall 60
Catchpoint 3 (syscall 'exit' [60])
(gdb) catch syscall 231
Catchpoint 4 (syscall 'exit_group' [231])
(gdb) c
Catchpoint 4 (call to syscall 'exit_group'), 0x00007ffff7912f3d in _exit () from /lib/libc.so.6
更新:
您的注释表示_exit断点设置正确,所以很可能您的进程不执行_exit.
这会使系统调用(SYS_exit,…)和另外一种可能性(我以前错过)):执行pthread_exit的所有线程.你可能想要在pthread_exit上设置一个断点(并且每次打它时执行信息线程 – 执行pthread_exit的最后一个线程将导致进程终止).
编辑:
还值得注意的是,您可以使用助记符名称,而不是系统调用数字.您还可以同时向捕获列表添加多个系统调用,如下所示:
(gdb) catch syscall exit exit_group
Catchpoint 2 (syscalls 'exit' [1] 'exit_group' [252])