一个后台程序,编译的时候加了 -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文件中查找相应的是哪个函数出问题了?
from:http://topic.csdn.net/u/20100610/10/8e752d2e-ec9b-4f4e-8c30-fb02f2a77c60.html
需要反汇编,然后查找00000036aea9c9de对应的指令是哪个函数。光看map文件看不出来。
用nm命令也可以
<!--End_rbody_66142540//-->
|
|
再次谢谢各位,找到了一个问题。
不过
还要再请教。
/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
)
兄弟,不知道你的问题解决了没有,我也出现了这个问题。
开始是因为php程序中有大量的replace into 语法,导致,修改成最基本select ,update,insert 后解决了一些,
但是还是会出现一些,找不到根源。
google了一下,基本上这种错误都发生在64位系统上。
我居然还出现了 15的
httpd[25128]: segfault at 000000000b5f8f40 rip 000000000b5f8f40 rsp 0000000078627658 error 15
请教下你的解决方法,谢谢。
我的情况可能和你不太一样。
我的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位的机器。
【转】内存访问过界:
from:http://dazhilao.javaeye.com/blog/855023
原文地址:http://hi.baidu.com/liheng_2009/blog/item/c065e880cc09129ef603a6e8.html
最近公司一台服务器的某个服务无故死掉,查看系统日志/var/log/messages ,发现有如下报错:
segfault at 0000000000000000 rip 0000000000878bd1 rsp 00007fffffa0e220 error 6
查找了一下,出现这个故障,一般是内存访问过界,以下是找到的资料。
/var/log/messages中一个关于APACHE的奇怪报错
最近以来,我的服务器/var/log/messages 中有一段日志,非常奇怪,而且我的apache经常并发很高,无故的死掉,我的环境是前端是nginx做代理,后端是apache,都在同一台机器上,下面我贴出日志,求大哥,大姐们,帮小弟看看了!
[root@168 logs]# tail /var/log/messages
Oct 9 00:29:20 168 kernel: httpd[24110]: segfault at 00007fff5989d878 rip 00002b8dd9595174 rsp 00007fff5989d880 error 6
Oct 9 00:34:55 168 kernel: httpd[24323]: segfault at 00007fff5989d878 rip 00002b8dd9595174 rsp 00007fff5989d880 error 6
Oct 9 00:47:26 168 kernel: httpd[24997]: segfault at 00007fff5989d878 rip 00002b8dd9595174 rsp 00007fff5989d880 error 6
答:
这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息。这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是 最后的error number.
在上面的例子中,error number是6, 转成二进制就是110, 即bit2=1, bit1=1, bit0=0, 按照上面的解释,我们可以得出这条信息是由于用户态程序读操作访问越界造成的。
error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7.
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
根据segfault信息调试定位程序bug:
#include<stdio.h>int main(){ int *p; *p=12; return 1;}
1. gcc testseg.c -o testseg -g,运行./testseg查看dmesg信息如下:
testseg[26063]: segfault at 0000000000000000 rip 0000000000400470 rsp 0000007fbffff8a0 error 6
2. 运行addr2line -e testseg 0000000000400470,输出如下:
/home/xxx/xxx/c/testseg.c:5 [...]
***********************
内存不足不会引起段错误。段错误通常出现在访问了非法的地址后,非法地址分为3类:
1. 访问的地址没有对应的物理内存。这类错误主要出现在越界访问,例如栈越界。比如说当前进程的栈只有5个页和它对应,共20k大小(x86平台),你访问的地址超过了这个范围,就会发生segmentation fault。
2.对地址的操作与该地址的属性不符合。例如该地址对应的内存是只读的,如文本段,你却试图进行写操作。
3.低权限访问高权限地址。这类情况发生在用户进程试图访问内核空间。例如x86中,TASK_SIZE以上的地址为内核空间,当用户态进程试图访问这些地址时,segmentation fault。********************
estseg[24850]: segfault at 0000000000000000 rip 0000000000400470 rsp 0000007fbffff8a0 error 6
这种信息一般都是由内存访问越界造成的,不管是用户态程序还是内核态程序访问越界都会出core, 并在系统日志里面输出一条这样的信息。这条信息的前面分别是访问越界的程序名,进程ID号,访问越界的地址以及当时进程堆栈地址等信息,比较有用的信息是最后的error number. 在上面的信息中,error number是4 ,下面详细介绍一下error number的信息:
在上面的例子中,error number是6, 转成二进制就是110, 即bit2=1, bit1=1, bit0=0, 按照上面的解释,我们可以得出这条信息是由于用户态程序读操作访问越界造成的。
error number是由三个字位组成的,从高到底分别为bit2 bit1和bit0,所以它的取值范围是0~7.
bit2: 值为1表示是用户态程序内存访问越界,值为0表示是内核态程序内存访问越界
bit1: 值为1表示是写操作导致内存访问越界,值为0表示是读操作导致内存访问越界
bit0: 值为1表示没有足够的权限访问非法地址的内容,值为0表示访问的非法地址根本没有对应的页面,也就是无效地址
根据segfault信息调试定位程序bug:
#include
int main()
{
int *p;
*p=12;
return 1;
}
1. gcc testseg.c -o testseg -g,运行./testseg查看dmesg信息如下:
testseg[26063]: segfault at 0000000000000000 rip 0000000000400470 rsp 0000007fbffff8a0 error 6
2. 运行addr2line -e testseg 0000000000400470,输出如下:
/home/xxx/xxx/c/testseg.c:5
参考资料:
http://en.wikipedia.org/wiki/Segmentation_fault
http://hi.baidu.com/sky_hacker/blog/item/86a933dcd6a858abcc116623.html
http://blog.5iwww.com/read.php/1109.htm
<!--End_rbody_66130456//-->
分享到:
相关推荐
dmesg命令输出segfault at * rip * rsp * error 4
本文分析了Python出现segfault错误解决方法。分享给大家供大家参考,具体如下: 最近python程序在运行过程中偶尔会引发系统segfault的错误,而且是在不定期不同代码段时发生的,所以单步调试没办法确定是哪一行代码...
Segmentation Fault定位到行的方法
ken_segfault
立即segfault您的R会话
Python C扩展,在名为segfault的模块中定义单个函数segfault ,如果调用该模块,则将进行segfault。
wasmtime-segfault-exp
概述该模块是调试Node.js C / C ++本机代码模块的... 使用该模块非常简单: var SegfaultHandler = require ( 'segfault-handler' ) ;SegfaultHandler . registerHandler ( "crash.log" ) ; // With no argument, Seg
我的一些项目围绕 K 桌面环境 (http://www.kde.org)。
php-crashers, 在PHP中,导致segfaults的示例脚本 php-crashersPHP中导致segfaults的示例脚本描述PHP是一种具有垃圾回收器的内存安全语言,因这里通常不会崩溃,除非有 Bug 。但是在分析PHP服务崩溃时,我偶尔发现...
-警告:联合国大隐含责任组织 ...-测试: sh detect_segfault.sh [二进制] [参数] [测试次数] 如果存在段错误,则可以使用第二个脚本检查它的位置: sh valgrinder.sh [项目目录] [参数] [失败的测试次数]
嗨,我是Raymond Tan :laptop::school::man_technologist_light_skin_tone:我是一名开发人员和一名讲师。 currently:laptop:我目前正在研究如何找到一份全职工作? 有任何想法吗? :seedling: 我目前正在为GRE做...
ubuntu@laptop:/tmp/build$ cmake -DCMAKE_INSTALL_PREFIX=/tmp/install ~/empty-argv-segfault-check/ && make && make install -- The CXX compiler identification is GNU 7.2.0 -- Check for working CXX ...
mysqld_exporter-0.14.0.windows-amd64.zip
介绍 sscanf()为C语言标准库函数,用于从指定字符串中读入与指定格式相符的数据。函数原型声明在stdio.h头文件中: int sscanf(const char *str, const char *format, ...); 该函数根据参数format(格式化字符串...
// Fix segfault with v7 #endif cinfo.comp_info[0].h_samp_factor = 2; cinfo.comp_info[0].v_samp_factor = 2; cinfo.comp_info[1].h_samp_factor = 1; cinfo.comp_info[1].v_samp_factor = 1; cinfo...
Issue #21134: Fix segfault when str is called on an uninitialized UnicodeEncodeError, UnicodeDecodeError, or UnicodeTranslateError object. Issue #19537: Fix PyUnicode_DATA() alignment under m68k. ...
A fix to a crash caused by a dir() on an uninitialized module. A fix to a crash for bytearray.translate() with invalid parameters. ...A patch to a warnings.warn segfault on a badly formatted string.