调试用C编写的linux守护进程

时间:2016-12-30 19:55:36

标签: c linux

有时我在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.

1 个答案:

答案 0 :(得分:1)

根据您提供的数据,可以在此处做很少的事情来诊断您的问题。我可以推断的是,地址为0,指向代码中的NULL解除引用(您将NULL作为指向字符串地址的指针,或类似的东西,使您的{{1调用失败---或类似,再次)地址printf()是在libc中引发异常的地方。您可以通过对libc.so.xx.xx.xx执行0x1a7000来猜测函数名称。转储核心(通过在执行守护程序之前设置ulimit -c unlimited)将允许使用postmortem调试器。或许守护进程的源代码也会有所帮助。对不起,但您的问题还远未完成,无法提供帮助。有关详细信息,请参阅How to create a Minimal, Complete, and Verifiable example