我的C程序在CentOS 5.7上崩溃,并显示以下日志:
kernel: [1030648.130682] myapp[16454]: segfault at 0 ip b765f683 sp bfc3fa0c error 4 in libc-2.5.so[b75ee000+157000]
似乎对libc的调用导致了段错误。我怎么知道段错误发生在libc的哪个函数中?
这是一个生产环境,没有留下核心转储文件;而且它很少重现。所以,我现在能做的是分析 libc 中的哪个函数(由我的程序调用)导致了这个段错误,然后我可以检查我的代码。
如果有指针可以解释这些数字的含义,那就太好了:ip b765f683、sp bfc3fa0c、错误 4、b75ee000+157000。我用谷歌搜索,但没有找到好的参考资料。
谢谢。
-ggdb
开关(使用 gcc)进行编译并使用 gdb
找出崩溃的来源在哪里......本教程非常有帮助。
通常,分段错误表明您的应用程序正在尝试访问某些未经授权/未输入的内存区域。使用 -g
开关编译代码,然后使用一些内存调试器(如 valgrind)运行生成的二进制文件,并检查 valgrind 的输出是什么。大多数情况下,您会收到导致错误的错误调用。