这些信息是 ubuntu 7.10 , gcc 4.1.3, gdb 6.6-debian 跟踪的
当printf不够有效时。。。。
1。读懂错误信息
一个简单的例子;
#include <stdio.h>
#include <stdlib.h>
void a(){
char *s = "ee";
free(s);
}
int main(int argc, char **argv){
a();
return 1;
}
程序运行可以得到一下错误信息:
*** glibc detected *** ./r: free(): invalid pointer: 0x0804865c ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7e2dd65]
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7e31800]
./r[0x804838c]
./r[0x80483a4]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7dda050]
./r[0x8048311]
======= Memory map: ========
08048000-08049000 r-xp 00000000 08:05 1047431 /home/jing/Desktop/ee/r
08049000-0804a000 rw-p 00000000 08:05 1047431 /home/jing/Desktop/ee/r
0804a000-0806b000 rw-p 0804a000 00:00 0 [heap]
b7db8000-b7dc2000 r-xp 00000000 08:05 3499334 /lib/libgcc_s.so.1
b7dc2000-b7dc3000 rw-p 0000a000 08:05 3499334 /lib/libgcc_s.so.1
b7dc3000-b7dc4000 rw-p b7dc3000 00:00 0
b7dc4000-b7f08000 r-xp 00000000 08:05 3532035 /lib/tls/i686/cmov/libc-2.6.1.so
b7f08000-b7f09000 r--p 00143000 08:05 3532035 /lib/tls/i686/cmov/libc-2.6.1.so
b7f09000-b7f0b000 rw-p 00144000 08:05 3532035 /lib/tls/i686/cmov/libc-2.6.1.so
b7f0b000-b7f0e000 rw-p b7f0b000 00:00 0
b7f22000-b7f24000 rw-p b7f22000 00:00 0
b7f24000-b7f3e000 r-xp 00000000 08:05 3499469 /lib/ld-2.6.1.so
b7f3e000-b7f40000 rw-p 00019000 08:05 3499469 /lib/ld-2.6.1.so
bff2d000-bff42000 rw-p bff2d000 00:00 0 [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
Aborted (core dumped)
backtrace 提供函数的调用情况。
memroy map 是程序分配是虚拟内存的分配情况, 它的格式在各个操作系统下是不同的。 以上信息是linux下的运行。实际上输出的是/proc/pid/maps的信息。
(这个图在我的浏览器下显示不正常,可以点击memory map的连接查看源)
40049000-4035c000 r-xp 00000000 03:05 824473 /jdk1.5/jre/lib/i386/client/libjvm.so |<------------->| ^ ^ ^ ^ |<----------------------------------->| Memory region | | | | | | | | | | Perm