目录
1,剥离命令
2,gdb+debug 文件的调试
今天在调试程序的时候发现,在测试部测试的程序都是剥离了符号表的,导致用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文件了。