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

本文介绍了当源代码位置变动后,如何使用GDB进行调试,包括通过`directory`命令指定源码路径、使用`set substitute-path`设置路径替换规则。此外,还讲解了GDB动态库搜索路径的设置,如`set sysroot`、`set solib-absolute-prefix`、`set solib-search-path`。文章还涵盖了调试技巧,如查看机器码、联合GDB与gdbserver进行远程调试等。
摘要由CSDN通过智能技术生成

发生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)

3) Bn / R

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

字正腔圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值