我已经在exit和_exit上设置了断点,但我的程序(运行在linux 2.6.16.46-0.12 sles10上的多线程应用程序)还是以某种无法定位的方式退出。
(gdb) c ... [New Thread 47513671297344 (LWP 15279)] [New Thread 47513667103040 (LWP 15280)] [New Thread 47513662908736 (LWP 15281)]
程序退出,代码为0177。 (gdb)
exit函数驻留在libc中,因此没有延迟加载共享库问题。有人知道还有其他神秘的触发器会导致无法捕获的退出吗?
编辑:现在这个问题只是理论上的。我尝试使用二分调试,撤销了一部分更改(问题消失了)。之后我再按顺序重新应用它们,现在即使将它们恢复到原始状态,我也无法再次重现该问题。
编辑2:我最近发现了一个导致这种错误的原因,可能是这个问题的根源。由于历史原因,我们的产品使用了邪恶的链接器标志-Bsymbolic。其中的副作用之一是,当调用未定义的符号时,GLIBC运行时链接器会以与此相同的方式bomb,然后你会在调试器中看到进程以0177退出。当运行时链接器以这种方式中止时,我猜它会直接进行对_exit的系统调用(而不是使用C运行时库exit()或_exit())。
catch syscall exit
和catch syscall exit_group
而不是数字值。例如,在我的系统中,exit
的值是[1]
,而不是[60]
。 - Ruslancatch syscall exit exit_group
一次性设置两者。事实上,现在正在编辑它... - Parthian Shot