gdb 可以打印扩展的 preprocessor/macro 结果吗?
Can gdb print expanded preprocessor/macro results?
例如:
#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。这个值在调试信息中可用以以某种方式打印吗?
在宏可能极其复杂的真实示例中,我不想浪费时间做预处理器的工作。
How can I know what C is?
首先你需要用 -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)
例如:
#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。这个值在调试信息中可用以以某种方式打印吗?
在宏可能极其复杂的真实示例中,我不想浪费时间做预处理器的工作。
How can I know what C is?
首先你需要用 -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)