如何在gdb中打印#define值?

时间:2014-11-12 07:47:15

标签: c gdb stack heap

所以我正在使用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的值?

2 个答案:

答案 0 :(得分:2)

答案在这里:GCC -g vs -g3 GDB Flag: What is the Difference?

使用-O0 -ggdb3编译:

gcc -O0 -ggdb3 source.c

From doc

  

-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混淆为变量。希望这会有所帮助。