我给自己定的退出和_exit和我的程序断点(多线程应用程序,在Linux上2.6.16.46-0.12 SLES10运行),在某种程度上是一种方式还是离开我找不到设置gdb退出断点不起作用?
(gdb) c ... [New Thread 47513671297344 (LWP 15279)] [New Thread 47513667103040 (LWP 15280)] [New Thread 47513662908736 (LWP 15281)] Program exited with code 0177. (gdb)
出口函数驻留在libc中,因此不存在延迟加载共享库问题。任何人都知道一些其他不可捉摸的神秘的退出触发器?
编辑:问题现在只是学术。我尝试了二进制搜索调试,取消了我的更改的一个子集(问题消失了)。在我再次依次应用它们之后,即使事物恢复到原始状态,我也不能再重现问题。
编辑2:我发现最近有这种错误的原因之一,这可能是这个问题的原始来源。由于历史原因,我们的产品使用邪恶的链接器标志-Bsymbolic。其中一个副作用是当一个符号未定义但被调用时,GLIBC运行时链接程序将以这种方式进行弹出,并且您将在调试程序中看到它作为0177退出的进程。当运行时链接程序以这种方式中止时,假设它使系统调用直接退出(而不是使用C运行时库exit()或_exit())。这与我无法用调试器中的退出断点捕捉到这一事实是一致的。
我会尝试构建gdb 7并查看它显示的内容。在*给出了同样的指令地址:
(看起来像一个相当标准的系统调用)。 我想我至少已经隔离了导致这个神秘退出的代码改变,只是不明白细节。 – 2009-11-23 04:05:35最好使用'catch syscall exit'和'catch syscall exit_group'而不是数值。例如,在我的系统中,'exit'是'[1]'不''[60]'。 – Ruslan 2014-05-24 07:23:47
此外,您可以使用'catch syscall exit exit_group'设置两者。事实上,现在编辑它... – 2015-06-10 17:51:19