gdb调试core文件

1,程序crash,如何能生成core文件?  
ulimit  -c unlimited(或者根据自己的经验值设置一个合理的数据)

执行完上述命令后,当程序挂掉的时候会自动留下自己的墓碑信息,给后人留下线索信息!

2,如何debug core文件?

  这里假定core文件的name为corer, 与core文件对应的同一版本的程序(带symbol)name为crasher

   

第一种方式: gdb  crasher corer
  第二种方式: gdb  <== 开启gdb
  			  file crasher <==加载crasher文件
  			  core corer  <==引入core文件

   查看一下当前crash的backtrace,如果crasher还加载了lib,无法定位话,需要加载lib的symbol(具体见下文)

3,如何加载lib symbols?
  
 solib-absolute-prefix设置的是被搜索文件路径的前缀,solib-search-path设置的是被搜索文件的路径。
 solib-search-path可以有多个路径,中间按用:隔开, solib-absolute-prefix的值只能有一个。

 下面以一个例子说明。

 先载入一个 core dump文件:
(gdb) core-file core 
[New LWP 489]
warning: Could not load shared library symbols for 2 libraries, e.g. /mnt/libshared.so.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
Core was generated by `./main'.
Program terminated with signal 11, Segmentation fault.
#0  0x2ac02508 in ?? ()

先执行下 info sharedlibrary:
(gdb) info sharedlibrary 
From        To          Syms Read   Shared Object Library
                        No          /mnt/libshared.so
                        No          /lib/libc.so.6
0x2ab417e0  0x2ab52bf0  Yes (*)     /home/charles/code/gcc-arm-2012.04-linux/arm-linux-gnueabi/libc/lib/ld-linux.so.3
(*): Shared library is missing debugging information.
有两个动态库还没有载入。
假设当前目录下有文件 libshared.so, 可以执行下面的命令:
(gdb) set solib-search-path .
Reading symbols from /home/charles/libshared.so...done.
Loaded symbols for /home/charles/libshared.so

再看下动态库的加载情况:
(gdb) info sharedlibrary 
From        To          Syms Read   Shared Object Library
0x2ac0240c  0x2ac02510  Yes         /home/charles/libshared.so
                        No          /lib/libc.so.6
0x2ab417e0  0x2ab52bf0  Yes (*)     /home/charles/code/gcc-arm-2012.04-linux/arm-linux-gnueabi/libc/lib/ld-linux.so.3
(*): Shared library is missing debugging information.

还有一个没有载入。
假设文件 libc.so.6在 /media/DATA/lib/libc.so.6
~$ ls /media/DATA/lib/ -l
total 860
-rw------- 1 charles charles 876656 Nov 18 03:56 libc.so.6

这时,可以用 solib-absolute-path。
(gdb) set solib-absolute-prefix /media/DATA
Reading symbols from /media/DATA/lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /media/DATA/lib/libc.so.6
这时,gdb用前缀 /media/DATA + /lib/libc.so.6,就找到了文件。
 /lib 是可执行文件在 目标机上  link libc.so.6的位置。

(gdb) bt full
#0  0x2ac02508 in fun () at testsharedlib.c:3
No locals.
#1  0x00008570 in main () at main.c:6
No locals.
(gdb) l *0x2ac02508
0x2ac02508 is in fun (testsharedlib.c:3).
1 void fun(void)
2 {
3 *(int *)0 = 0;
4 }


注意事项:
1. 查看so库的加载路径是否正确可使用info sharedlibrary命令,如果已找到对应的文件则其From和To的加载地址会有值,并且右边路径显示的就是加载文件所在的地址,这个时候,如果so库文件含符号信息,则symsRead的值为Yes,否则为No,如果未找到对应的文件则From和To的地址为空,syms Read的值为No,此时右边路径显示的是Coredump文件中库文件路径。

2. 如果在Coredump文件载入过程中,或者info sharedlibrary命令时,出现" Cannot access memory at address 0x87000069 "这样的错误,这通常是由于所使用的主执行文件("file"命令或"exec-file"命令)与Coredump文件("core"命令或"core-file"命令)两者不匹配导致的。这个时候应检查主执行文件是否是生成Coredump时所用的主执行文件,只要差一点,就可能导致动态库信息读取错误。

3. 如果载入过程中有" warning: .dynamic section for "/lib/librt.so.1" is not at the expected address (wrong library or version mismatch?) "这样的提示,这通常是库搜索路径设置错误,GDB载入了错误的库文件导致的。这时,应使用info sharedlibrary命令查看相应库的载入路径,并使用set sysroot或set solib-search-path修改搜索路径来将错误的库修正到正确的路径上。

4. 在设置了搜索路路径后,最好先用file命令载入主执行文件,再用core命令载入Coredump文件,这样才能保证正确载入库的符号表。否则,如果先用core命令载入Coredump文件,再用file命令载入主执行文件,那么会造成库只是被搜索但并不载入符号(使用info sharedlibrary命令可以看到),这时再重新执行一次core命令就可以了。

你可能感兴趣的:(Debug,C/C++)