有时,我在c中编写的守护进程会收到以下错误消息:

[Fri Dec 30 07:58:54 2016] listend[13944]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

[Fri Dec 30 07:58:54 2016] listend[13948]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

[Fri Dec 30 07:58:54 2016] listend[13949]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

[Fri Dec 30 07:58:54 2016] listend[13950]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

[Fri Dec 30 07:58:54 2016] listend[13951]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

[Fri Dec 30 07:58:54 2016] listend[13952]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

[Fri Dec 30 07:58:54 2016] listend[13953]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

[Fri Dec 30 07:58:54 2016] listend[13954]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

[Fri Dec 30 07:58:54 2016] listend[13955]: segfault at 0 ip b7601e22 sp bf901d00 error 4 in libc-2.19.so[b7575000+1a7000]

我的问题是如何检查libc-2.19中的地址,以便查看错误发生时调用的是哪个函数?我试过用gdb
但我得到:
$ gdb code/listen/i686-Linux/listend
.
.
(gdb) info addr 0xb7575000
No symbol "0xb7575000" in current context.
(gdb) info addr 0xb771c000
No symbol "0xb771c000" in current context.

最佳答案

有了你提供的数据,在这里几乎无法对你的问题做出诊断。我可以推断的是,地址为0,指向代码中的一个NULL解引用(您将NULL作为指向字符串地址的指针传递,或者类似的东西,使您的printf()调用失败——或者类似的,再次传递)地址0x1a7000是libc中引发异常的地方。您可能可以通过对libc.so.xx.xx.xx执行nm(1)来猜测函数名。转储核心(在执行守护进程之前设置ulimit-c unlimited)将允许使用后期调试器。或者守护进程的源代码也会有帮助。很抱歉,你的问题还远没有完全解决。有关更多信息,请参见How to create a Minimal, Complete, and Verifiable example

关于c - 调试用C编写的linux守护进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41401984/

10-11 14:30