gdb与symbol符号表文件的调试

目录

1,剥离命令

2,gdb+debug 文件的调试

3,实例


        今天在调试程序的时候发现,在测试部测试的程序都是剥离了符号表的,导致用gdb无法调试,只有找到符号表文件才能继续gdb调试,好在符号表文件是和程序一起发布的。之前一直没有用符号表文件进行调试过,今天记录一下。

1,剥离命令

strip 和 objcopy ,这两个命令都可以用来剥离符号信息,我们看man strip,如下:

strip - Discard symbols from object files.

而 man objcopy 如下:

objcopy - copy and translate object files

这两个命令有很多相似,这个可以慢慢自己研究。今天要用的是 objcopy 命令把app里的符号信息拷出来。

objcopy --only-keep-debug app app.debug 把debug信息拷贝到 app.debug 文件中,可以用于gdb的调试。如果不指定目标文件(即app.debug)则是创建了临时文件,并最终覆盖了原文件,如:

objcopy --only-keep-debug app 最终 app 将不包含debug信息。而上面那个命令,原来还是保留着debug信息。如下图, 一个是剥离了debug信息,一个是没有剥离 debug 信息

2,gdb+debug 文件的调试

 即使是剥离了 debug 信息,用 gdb 调试时还是可以打断点的,但只有地址,没有代码行信息,如加个函数断点:

 断点触发时,bt 出来的是没有相关的符号信息的

 gdb 里用 symbol-file 加载 debug 文件后,却无法解析栈帧:

 最后是用这个命令:objcopy --add-gnu-debuglink=app.debug app,即在objcopy debug 符号出来后,再加上这条命令,然后在gdb里调试时,这个debug文件被自动加载了:

 然后再gdb的时候,bt 出来后符号信息就全了:

但实际发布的程序就是剥离的app和符号表文件是分开的,上面测试的app和app.debug是在同一个目录下,它能找到然后自动加载了?实际的项目中,被剥离的符号文件一般是一个压缩包,解压出来后是很多的.sym 文件,在gdb的时候就要手动加载这些.sym文件了。

3,实例

        今天刚好也要gdb调试,于是具体步骤如下:

1)gdb attach pid

2) 打断点

 这里只有一个地址,而没有文件信息,如果有符号表的情况下应该是有文件名及行号。

3)断点触发

可以看到这里有很多无法解析的符号

4)手动解压符号表包

5)手动加载符号文件

在gdb里直接ctrl+c中断一下,加载符号表文件

6)再次断点

这里就能清晰看到有文件名及行号信息。注意:因为我这里只加载了一个app的symbol,所以断点在app里都是可以解析的,而如果一些动态库也有相应的symbol文件的话,如果在调试也是需要另外载的。 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值