即使使用 -g3 或 -ggdb3 或 -gdwarf-4 也不存在 gdb 宏符号
Posted
技术标签:
【中文标题】即使使用 -g3 或 -ggdb3 或 -gdwarf-4 也不存在 gdb 宏符号【英文标题】:gdb macro symbols not present even when using -g3 or -ggdb3 or -gdwarf-4 【发布时间】:2012-05-08 09:42:46 【问题描述】:我有这个 C 文件(sample.c):
#include <stdio.h>
#define M 42
#define ADD(x) (M + x)
int main ()
printf("%d\n", M);
printf("%d\n", ADD(2));
return 0;
我用来编译的:
$ gcc -O0 -Wall -g3 sample.c -o sample
然后调试
$ gdb ./sample
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-pc-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.gentoo.org/>...
Reading symbols from /tmp/sample...done.
(gdb) macro list
(gdb) macro expand ADD(2)
expands to: ADD(2)
(gdb) print M
No symbol "M" in current context.
(gdb) q
这曾经有效。我需要它来工作,因为我正在使用 #define 硬件外围设备和内存地址名称的库。
这似乎与Sourceware gdb site 上显示的行为直接矛盾。
我做错了什么?
【问题讨论】:
你的 GCC 版本是多少?在 Ubuntu 14.04 上的 GCC 4.8 GDB 7.7.1 上为我工作。相关:***.com/questions/2934006/… 【参考方案1】:看起来宏需要以一种或另一种方式“引入范围”。如果您完全按照链接到的页面中的示例进行操作,它们就会像宣传的那样工作(至少它们对我有用)。
示例(t.c
是您的源文件):
$ gcc -O0 -g3 t.c
$ gdb ./a.out
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
...
Reading symbols from .../a.out...done.
(gdb) info macro ADD
The symbol `ADD' has no definition as a C/C++ preprocessor macro
at <user-defined>:-1
// Macros not loaded yet
(gdb) list main
1 #include <stdio.h>
2 #define M 42
3 #define ADD(x) (M + x)
4 int main ()
5
6 printf("%d\n", M);
7 printf("%d\n", ADD(2));
8 return 0;
9
(gdb) info macro ADD
Defined at /home/foo/tmp/t.c:3
#define ADD(x) (M + x)
// Macros "in scope"/loaded
(gdb) macro expand ADD(42)
expands to: (42 + 42)
(gdb) macro expand M
expands to: 42
(gdb) macro expand ADD(M)
expands to: (42 + 42)
(gdb)
或者:
$ gdb ./a.out
GNU gdb (Gentoo 7.3.1 p2) 7.3.1
...
Reading symbols from .../a.out...done.
(gdb) macro expand ADD(1)
expands to: ADD(1)
// Macros not available yet
(gdb) break main
Breakpoint 1 at 0x400538: file t.c, line 6.
(gdb) r
Starting program: /home/foo/tmp/a.out
Breakpoint 1, main () at t.c:6
6 printf("%d\n", M);
(gdb) macro expand ADD(1)
expands to: (42 + 1)
// Macros loaded
(gdb)
【讨论】:
除非我使用 gdb 7.4,否则我看不到您的示例中演示的行为。我认为这是因为一些 gcc 4.8(主实验)必须改变调试符号的存储方式,而旧的 gdb 无法识别。所以基本上,我需要确保如果我使用前沿编译器,我应该使用前沿调试器。谢谢。【参考方案2】:先尝试list
:
(gdb) list
1 #include <stdio.h>
2 #define M 42
3 #define ADD(x) (M + x)
4 int main ()
5
6 printf("%d\n", M);
7 printf("%d\n", ADD(2));
8 return 0;
9
10
(gdb) info macro M
Defined at /home/ouah/tst.c:2
#define M 42
(gdb) info macro ADD
Defined at /home/ouah/tst.c:3
#define ADD(x) (M + x)
(gdb)
【讨论】:
这并没有为我解决。从根本上说,我认为我的问题是使用新的 gcc 和旧的 gdb。不过还是谢谢。【参考方案3】:我遇到了示例问题并意识到我使用的是旧版本的 gcc。
之前我使用gcc 3.46和gdb 7.3,宏扩展不起作用,将gcc升级到4.5.2和gdb到7.5解决了这个问题。
【讨论】:
【参考方案4】:gdb 适用于所有宏仅在预处理时被替换的可执行文件,因此 M 不存在于上下文中
【讨论】:
我过去的编译方式完全相同,并且能够保留#define 的宏和常量。如果您提供 -g3 或 -ggdb3,Sourceware gdb 站点甚至将这种行为记录为可用。所以有问题。 @Pawan,也许你想删除这个答案,因为 GDB 不是这种情况,它可能会让读者感到困惑。以上是关于即使使用 -g3 或 -ggdb3 或 -gdwarf-4 也不存在 gdb 宏符号的主要内容,如果未能解决你的问题,请参考以下文章
Sqoop 导入失败:请使用 --split-by 指定一个或使用 '-m 1' 执行顺序导入 即使在设置 mapper = 1 后也会出错
即使使用 `?` 链接或条件检查,Typescript Partial<T> 也会导致未定义的错误
即使输入文本有效(Javascript或Jquery),如何强制输入文本无效