所以我正在使用gdb进行一些堆栈/堆挖掘并尝试获取someInt
的值,但是已经抛出了我有限的gdb知识来获得它没有效果。我需要使用gdb获取someInt
的值,并且它仅在#define第20行之外的一个位置引用
#define someInt 0x11111111
void someFunc() {
// ...
int a = 0;
if(a==someInt) { //line 20
//...
}
}
在已编译的程序上调用gdb之后我尝试了gdb break 20
然后gdb x\dw $someInt
我在当前上下文中得到了无符号'someInt'。
如果我尝试x/dw 0x11111111
我得到'无法访问地址0x11111111处的内存'。我无法重新编译代码la How do I print a #defined constant in GDB?,因此在如何在该空间打印值时会丢失。
如何使用gdb(最有可能使用x)打印出someInt的值?
答案 0 :(得分:2)
答案在这里:GCC -g vs -g3 GDB Flag: What is the Difference?
使用-O0 -ggdb3编译:
gcc -O0 -ggdb3 source.c
-ggdb level - 请求调试信息,并使用级别指定信息量。默认级别为2.
3级包含额外信息,例如程序中存在的所有宏定义。使用-g3时,某些调试器支持宏扩展。
9 if(a == someInt)
(gdb) list
4
5 int main()
6 {
7 int a=0;
8
9 if(a == someInt)
10 {
11 printf("!\n");
12 }
13 }
(gdb) p someInt
$1 = 1111
答案 1 :(得分:0)
是肯定的。 MACROS通常被挖掘出来并简单地用作text replacement
。这就是gdb在您的代码中报告没有someInt
。
有效地,在预处理之后,您的代码看起来像
void someFunc() {
// ...
int a = 0;
if(a==0x11111111) { //line 20 //note the change
//...
}
}
所以,在你的二进制文件中,不存在someInt
。
提示:不要将someInt
混淆为变量。希望这会有所帮助。