哪位大侠指点下如何定位segfault at xxx rip xxx rsp xxx error 4???

iamwlj 2010-06-10 10:50:15
一个后台程序,编译的时候加了 -g -ggdb,也生成了map文件,开了core dump
程序崩溃的时候生成了 core文件。gdb看了没有什么明显的信息。
#0 0x00000036aea9c9de in ?? ()
Cannot access memory at address 0x42399b50

/var/log/message中有这样的信息
segfault at fffffffffffffffd rip 00000036aea9c9de rsp 0000000042841b60 error 4

请问如何根据 00000036aea9c9de 去map文件中查找相应的是哪个函数出问题了?
...全文
5203 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamwlj 2010-06-25
  • 打赏
  • 举报
回复
我的情况可能和你不太一样。
我的C的程序中出现的问题。
我加了下面的代码。

signal(SIGSEGV, (__sighandler_t)sigdump);

void sigdump(int s)
{
void *array[10];

size_t size;
char **strings;
size_t i;

size = backtrace (array, 10);
strings = backtrace_symbols (array, size);
printf ("Obtained %zd stack frames.\n", size);
for (i = 0; i < size; i++)
printf ("%s\n", strings[i]);
free (strings);
exit(0);
}

在发生段错误的时候,会打印一些信息,根据这些信息。
Obtained 10 stack frames.
/usr/sbin/xserver [0x677896]
/lib64/libc.so.6 [0x36a96302d0]
/usr/sbin/xserver [0x5a0473]
/usr/sbin/xserver [0x669e2c]
/usr/sbin/xserver [0x600a37]
/usr/sbin/xserver [0x5ff3f7]
/usr/sbin/xserver [0x6783a8]
/usr/sbin/xserver [0x677d4d]
/lib64/libc.so.6(__libc_start_main+0xf4) [0x36a961d994]
/usr/sbin/xserver(_ZNSt8ios_base4InitD1Ev+0x39) [0x40c6d9]

在反汇编出来的文件可以找到出问题的函数的大致位置。基本上可以确定问题所在了。
和你类似,我出问题的也是64位的机器。
ghewqqq 2010-06-24
  • 打赏
  • 举报
回复
兄弟,不知道你的问题解决了没有,我也出现了这个问题。
开始是因为php程序中有大量的replace into 语法,导致,修改成最基本select ,update,insert 后解决了一些,
但是还是会出现一些,找不到根源。
google了一下,基本上这种错误都发生在64位系统上。
我居然还出现了 15的
httpd[25128]: segfault at 000000000b5f8f40 rip 000000000b5f8f40 rsp 0000000078627658 error 15
请教下你的解决方法,谢谢。

太乙 2010-06-11
  • 打赏
  • 举报
回复
bt看看??
iamwlj 2010-06-11
  • 打赏
  • 举报
回复
多谢各位了。我试试看。
iamwlj 2010-06-11
  • 打赏
  • 举报
回复

再次谢谢各位,找到了一个问题。

不过
还要再请教。
/var/log/message还有这样的信息
general protection rip:52a3a7 rsp:7fffe4360fe0 error:0

这个地址52a3a7 是可以在反汇编出来的文件里面找到的。

000000000052a370 <_ZN4Hero4CastEiiiii>:
52a3a2: 48 85 c0 test %rax,%rax
..........
52a3a5: 74 e9 je 52a390 <_ZN4Hero4CastEiiiii+0x20>
52a3a7: 39 68 08 cmp %ebp,0x8(%rax)
52a3aa: 75 e4 jne 52a390 <_ZN4Hero4CastEiiiii+0x20>
52a3ac: 48 8b 83 a8 03 00 00 mov 0x3a8(%rbx),%rax

根据上面的函数显示(Hero_Cast),找到了一个问题。

不过
00000036aea9c9de
这个找不到啊。
取最后面的六位?



to:hqin6
bt过了。看到的信息就是

#0 0x00000036aea9c9de in ?? ()
Cannot access memory at address 0x42399b50

brookmill 2010-06-10
  • 打赏
  • 举报
回复
用nm命令也可以
brookmill 2010-06-10
  • 打赏
  • 举报
回复
readelf -s a.out 可以查看符号表,就能找到对应的函数了。
objdump -d a.out > a.s 可以反汇编,不但能找到函数,还能直接定位到指令。
http://blog.csdn.net/eroswang/archive/2007/12/25/1967243.aspx
nevil 2010-06-10
  • 打赏
  • 举报
回复
需要反汇编,然后查找00000036aea9c9de对应的指令是哪个函数。光看map文件看不出来。

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧