我有以下示例代码
#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有另一个命令 symbol-file ,但它会覆盖以前加载的符号。 所以我必须使用此命令在gdb中添加许多符号文件。 我的系统是64位运行ubuntu LTS 12.04 gdb版本是7.4-2012.04 gcc版本是4.6.3
答案 0 :(得分:16)
objcopy --only-keep-debug a.out a.out.sym
如果您希望GDB自动加载a.out.sym ,请按照here概述的步骤进行操作(特别注意您需要执行“添加.gnu_debuglink
“一步”。
此地址代表什么
GDB想要的地址是二进制文件.text
部分的位置。要找到它,请使用readelf -WS a.out
。 E.g。
$ 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
作为加载地址。