前两天在群里看到在讨论如何把debug版中的符号表加到release版本中,觉得这个非常有用,所以学习一下。
使用的工具是objcopy。
如果要生成单独的调试信息文件,命令如下:
objcopy –only -keep -debug foo foo.dbg
如果要去除调试信息(还可以使用strip命令),命令如下:
objcopy --only -keep -debug foo foo.dbg
如果要添加调试信息文件链接,命令如下:
objcopy --add -gnu -debuglink =foo.dbg foo
确认调试信息文件链接,命令如下:
objdump -s -j .gnu_debuglink foo
调试release程序前首先需要从debug版本中获取符号表信息,这个是通过objcopy这个利器,命令如下:
objcopy --only -keep -debug debug info.dbg
其中debug是带有符号表的可执行程序,info.dbg是保存符号表的文件。
在使用gdb调试release程序的时候,使用--symbol命令来加载前面生成的符号表,命令如下:
[root@CentOS_192 debug] #gdb -q --symbol=info.dbg --exec=release
Reading symbols from
/root
/debug
/info.dbg...
done.
(gdb) start
Temporary breakpoint
at 0x4004ef
: file
test.c, line
.
Starting program
:
/root
/debug
/release
Temporary breakpoint
, main () at
test.c
:
Reading symbols from
/root
/debug
/info.dbg...
done.
(gdb) start
Temporary breakpoint
at 0x4004ef
: file
test.c, line
.
Starting program
:
/root
/debug
/release
Temporary breakpoint
, main () at
test.c
:
return func();
Missing separate debuginfos, use
: debuginfo
-install glibc
-
.
-
.
.el6.x86_64
(gdb)
其中--exec选项指定的release就是release版本的程序,这个程序原本是没有符号表信息的。