【问题标题】:How to print #define value in gdb?如何在 gdb 中打印#define 值?
【发布时间】:2015-01-08 23:54:52
【问题描述】:

所以我正在使用 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 在当前上下文中得到 No symbol 'someInt'。 如果我尝试x/dw 0x11111111,我会得到“无法访问地址 0x11111111 的内存”。我无法像 How do I print a #defined constant in GDB? 那样重新编译代码,因此不知道如何在该空间打印值。

如何使用 gdb(最有可能使用 x)打印出 someInt 的值?

【问题讨论】:

  • grab the value for someInt .... 概念问题。 someInt到底是什么??
  • someInt 是一个值,如果 'a' 匹配它,我会(通过 if 语句)模拟 shell 访问以在书中展示一个概念
  • 所以,你可以看到定义,但你还想知道宏的值?还是需要打印 a 的值?
  • 帮自己一个忙,并确保您的宏都有 UPPER_CASE 名称。这样,您就不太可能像您似乎正在做的那样将它们与变量混淆。宏是供预处理器排序的,一旦编译,它们就不再存在了

标签: c gdb heap-memory stack-memory


【解决方案1】:

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

使用 -O0 -ggdb3 编译:

gcc -O0 -ggdb3 source.c

From doc

-ggdblevel - 请求调试信息,也使用 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

【讨论】:

    【解决方案2】:

    是的。 MACROS 通常被扩展并简单地用作text replacement。这就是 gdb 报告的原因,在您的代码中,没有 someInt

    实际上,经过预处理后,您的代码看起来像

    void someFunc() {
       // ...
       int a = 0;
       if(a==0x11111111) {  //line 20 //note the change
       //...
       }
    }
    

    所以,在您的二进制文件中,不存在 someInt

    提示:不要将someInt 混淆为变量。希望这会有所帮助。

    【讨论】:

    • 澄清了问题;我正在寻找如何使用 gdb(并与 x 结合)在#define 地址打印值,而不是修改代码
    • @KurtWagner 你怎么知道value at #define address 是可访问的?你在做什么?
    • 我正在阅读一本开发书籍,以更好地了解人们如何做诸如堆栈/堆溢出和获取 shell 访问权限之类的事情。这是问题之一,所以它应该是可行的,我只是没有得到对这一位至关重要的 gdb 概念......
    • @KurtWagner:类似对象的宏没有任何地址。这些只是在预处理阶段之后消失了。要么从GDB manual重新编译你的程序,使用正确的语法,要么从程序的源代码中推断出来(或者如果符号不可用,则取消)。
    • 啊,好吧,我在想也许我应该尝试在其中一个寄存器上使用 gdb?在英特尔架构中,第一个/第二个参数是否存在于 if 语句中?
    猜你喜欢
    • 2011-07-22
    • 2010-09-11
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多