【问题标题】:Can gdb print expanded preprocessor/macro results?gdb 可以打印扩展的预处理器/宏结果吗?
【发布时间】:2021-02-04 20:02:15
【问题描述】:

例如:

#include <stdlib.h>

#define A 20
#define B 22
#define C (A+B)

int main()
{
    srand(time(0));
    int i = (rand()&1) + C;
    return i;
}

在 gdb 中,

(gdb) print C
No symbol "C" in current context.

我怎么知道C 是什么? gdb 可以告诉我吗? (我添加了rand(),所以我们不能轻易推断它是什么)

预处理器将用(20+22) 替换C。这个值在 debuginfo 中是否可以以某种方式打印?

在一个宏可能非常复杂的真实示例中,我不想浪费时间做预处理器的工作。

【问题讨论】:

  • 如果您使用 gcc 编译并传递 -g3 选项(用于 3 级调试信息),您将拥有程序中存在的所有宏定义。默认为调试级别(仅-g 为 2 级)。

标签: gdb c-preprocessor preprocessor debug-information


【解决方案1】:

我怎么知道 C 是什么?

首先,您需要使用-g3 标志构建程序,以便在调试信息中包含宏信息,启动程序并使用info macro 显示宏定义:

(gdb) start
Temporary breakpoint 1 at 0x40114e: file 1.c, line 9.
Starting program: /tmp/a.out 
Missing separate debuginfos, use: dnf debuginfo-install glibc-2.31-4.fc32.x86_64

Temporary breakpoint 1, main () at 1.c:9
9       srand(time(0));
(gdb) info macro C
Defined at /tmp/1.c:5
#define C (A+B)
(gdb) info macro A
Defined at /tmp/1.c:3
#define A 20
(gdb) info macro B
Defined at /tmp/1.c:4
#define B 22

还可以展开宏:

(gdb) macro expand C
expands to: (20+22)

【讨论】:

    猜你喜欢
    • 2018-12-27
    • 1970-01-01
    • 2019-07-21
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多