GDB源码移动后如何调试以及几种解决方法

发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.   

gdb [exec file] [ core file]

gdb之所以能够知道对应的源代码,是因为调试版的可执行程序中记录了源代码的位置;

 

因为源代码的位置在编译之后可能会移动到其它地方,所以gdb还会在当前目录中查找源代码

另外gdb也允许明确指定源代码的搜索位置

  1. gdb允许明确指定源代码位置,以应付源代码位置迁移的情况
  • directory path-list(dir /home/fdj/src/Sources/fsc/tools/test_lni):将一个或者多个源代码搜索目录加入到当前源码搜索目录列表的前面,目录之间使用空格间隔。
  • directory(dir):不带参数的directory将源码搜索目录恢复为默认值。
  • /测试unuse///set directories path-list:将源码目录设置为path-list,但是会补上默认目录(同 directory path-list)。
  • show directories( show dir):显示源码搜索目录列表。
    • gdb在编译时目录中搜索 ($cdir : compilation directory)
    • 当前目录中搜索 ($cwd : current working directory)
    • 源代码搜索目录列表 (substitute-path)
  • //gdb 的dir 命令添加的源码搜索路径只对相对路径的情况有效。show directories  看到设置成功
  • //可以list  查看是不是绝对路径,也可以用命令 readelf -p .debug_str  exe_or_so_file 看到里面保存是是完整的绝对路径。
  • // readelf -p .debug_str ../lib64/libh5test_hqtest.so 

     如果gcc里面-g  生成的debug_info 使用的绝对路径了,最简单的办法就是你把源码也放到相应的位置上去了。

 

 2. gdb允许设置路径替换规则,以应付源代码位置迁移的情况。

------------------------------------------------------------

    • set substitute-path from to   :设置目录替换规则,放置在规则列表的末端。
    • unset substitute-path [path] :删除path对应的替换规则,或者删除所有的替换规则。
      show substitute-path [path] :显示path对应的替换规则,或者显示所有的替换规则
    • -------------------------------------------------------------------------如果你不想使用这个绝对路径,那也还是有办法的。 GDB还提供另外一个选择,可以让你修改源码搜索路径,把源码绝对路径里面的一个path映射到另一个path上去,这样即使你debug info了里面的是绝对路径,源码也可以放到另外的目录。

      这就是命令

      set substitute-path from_path  to_path

      比如 list显示的源码是   /home/aaa/1.cpp

      那么设置了  set substitute-path /home/aaa/   /home/bbb/

 

 

二、gdb 动态库搜索路径

  当gdb无法显示so动态库的信息或者显示信息有误时,通常是由于库搜索路径错误导致的,可使用set sysroot、set solib-absolute-prefix、set solib-search-path来指定库搜索路径。

  1. set sysroot 与 set solib-absolute-prefix 是同一条命令,实际上,set sysroot是set solib-absolute-prefix 的别名。

  2. set solib-search-path设置动态库的搜索路径,该命令可设置多个搜索路径,路径之间使用“:”隔开(在linux中为冒号,DOS和Win32中为分号)。

  3. set solib-absolute-prefix 与 set solib-search-path 的区别:

  总体上来说solib-absolute-prefix设置库的绝对路径前缀,只对绝对路径有效;而solib-search-path设置库的搜索路径,对绝对路径和相对路径均起作用。

  (编译器自动链接的so库多采用绝对路径)。

3.1、gdb
3.2、set solib-search-path libs 输入后TAB键libs会取当前目录下的libs****
3.3、set solib-absolute-prefix libs 输入Tab,同2
3.4、 file libs***/bin/hxx-server
3.5、core-file core.***

 

  在载入动态库信息时Coredump会碰到两种路径:绝对路径和相对路径。编译时链接的库通常是绝对路径,例如"/lib/libc.so.6"、"/lib/libdl.so.2"等,

  此时在Coredump文件中也同样保存为绝对路径;而程序用dlopen函数载入的so库可能使用相对路径,例如"./libddd.so",此时Coredump文件原封不动地保存相同的路径。

  为便于表述,用A表示set solib-absolute-prefix设置的路径,R(A)表示A去掉根前缀后的路径(即去掉前缀“/”符号),用Bn表示set solib-search-path设置的每一条路径,

  用X表示Coredump中保存的库路径,即待搜索的库文件路径,F(X)表示X中去掉目录后的文件名(路径最后“/”符号后的字符串)。

  • 绝对路径,搜索顺序

1) A / X                          ; 先添加solib-absolute-prefix前缀进行搜索,成功则不再继续,否则继续2)

2) R(A) / X                     ; 再把1)的根前缀去掉后进行搜索,成功则不再继续,否则继续3)

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