我有以下示例代码
#include<stdio.h> int main() { int num1, num2; printf("Enter two numbers\n"); scanf("%d",&num1); scanf("%d",&num2); int i; for(i = 0; i < num2; i++) num1 = num1 + num1; printf("Result is %d \n",num1); return 0; }
我用-g选项将这段代码编译为gcc。
gcc -g file.c
生成单独的符号文件
objcopy --only-keep-debug a.out a.out.sym
去除a.out中的符号
strip -s a.out
在gdb中加载此a.out
gdb a.out
gdb说“找不到调试信息”很好。然后我在gdb中使用 add-symbol-file 命令
(gdb) add-symbol-file a.out.debug [Enter] The address where a.out.debug has been loaded is missing
我知道gdb还有另一个命令 符号文件, 但是它会覆盖以前加载的符号。因此,我必须使用此命令在gdb中添加 许多符号文件 。我的系统是64位的,运行ubuntu LTS 12.04 gdb版本是7.4-2012.04 gcc版本是4.6.3
objcopy –only-keep-debug a.out a.out.sym
如果您希望GDB 自动 加载a.out.sym ,请遵循此处概述的步骤(特别注意,您需要执行“添加.gnu_debuglink”步骤)。
.gnu_debuglink
这个地址代表什么
GDB想要的地址是.text二进制代码段的位置。要找到它,请使用readelf -WS a.out。例如
.text
readelf -WS a.out
$ readelf -WS /bin/date There are 28 section headers, starting at offset 0xe350: Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .interp PROGBITS 0000000000400238 000238 00001c 00 A 0 0 1 ... [13] .text PROGBITS 0000000000401900 001900 0077f8 00 AX 0 0 16
在这里,您想给GDB 0x401900作为加载地址。
0x401900