操作系统环境
Linux ubuntu 3.2.0-24-generic-pae #37-Ubuntu SMP Wed Apr 25 10:47:59 UTC 2012 i686 i686 i386 GNU/Linux
背景:
生成release版程序时,进行strip操作,但是strip后,可执行程序中不再有调试信息和一些符号表。当出现问题时,排查带来了很大的难题。
俗话讲:strip的越爽,出现问题时,头疼的越厉害。
目的:
为了兼顾,既将符号表去掉了,出问题时又能用符号表。采用符号表和可执行程序分离的方式。
编译程序:
gcc -g test.c -o test
制作符号表
objcopy --only-keep-debug test test.dbg
test.dbg:产生的符号表文件
可执行程序strip
strip test -o test_release
test_release:经过strip后的程序
已经strip程序添加符号表连接
objcopy --add-gnu-debuglink=test.dbg test_release
test_release:文件中已经包含了符号表名字连接
这里test_release就是strip后的可执行程序,当程序发生异常产生core文件后,将test.dbg放到test_release同目录下,
可以直接gdb test_strip core查看段错误位置,也可以GDB挂载程序,这是会显示更多的信息。
如果对库文件进行strip,可以将调试信息放在'/usr/lib/debug'
放在哪个目录可以在gdb模式下,使用命令:show debug-file-directory查看
这里是在Ubuntu平台下试过的。这个方法可以用于动态库和可执行程序,静态库是不允许strip的,因为他会和最终的可执行程序一起strip。
在咱们部门的主程序中,这个方法应该是没问题,有兴趣的同事可以尝试一下,让主程序也实现这个功能,每次出release程序的时候,同时出一个符号表,
这样就不会再GDB时束手无策了。