在浏览我的编译器的各种选项开关时(我的组织为我的给定硬件配置支持GNU C ++ 3.2.3),我遇到了这个问题:

-glevel
   :
Level 3 includes extra information, such as all the macro definitions
present in the program. Some debuggers support macro expansion when
you use -g3.

我编译了一个带有几个宏的测试程序(例如一个循环,一个参数上的if-then-else),然后尝试了商业调试器TotalView和GDB编译的代码-g3。我没有看到任何区别(宏没有扩展到他们的原始代码,我无法'进入'宏等等。)

这里有人在GNU编译器上使用-g3获得额外调试'功能'的经验吗?

有帮助吗?

解决方案

您的问题似乎暗示您不了解宏是什么。 当然你无法进入宏。

-g3对于“宏重”非常有用。程式。考虑:

int main()
{
  int i;
  for (i = 0; i < 20; ++i) {
#define A(x) case x: printf(#x "\n"); break
    switch(i) {
      A(1); A(2); A(3); A(4); /* line 7 */
#undef A
#define A(x) case 10+x: printf("10+" #x "\n"); break
      A(1); A(2); /* line 10 */
    }
  }
  return 0;
}

没有-g3,当你在第7行或第10行停止时,你可能需要搜索很多A()的定义,并且可能有很多这样的定义,所以你必须弄清楚哪一个是“当前”。

使用-g3,GDB可以为您做繁重的工作:

(gdb) b 7
Breakpoint 1 at 0x4004cc: file m.c, line 7.
(gdb) b 10
Breakpoint 2 at 0x4004fc: file m.c, line 10.
(gdb) r

Breakpoint 1, main () at m.c:7
7         A(1); A(2); A(3); A(4);
(gdb) info macro A
Defined at /tmp/m.c:5
#define A(x) case x: printf(#x "\n"); break
(gdb) c
1
2
3
4

Breakpoint 2, main () at m.c:10
10        A(1); A(2);
(gdb) info macro A
Defined at /tmp/m.c:9
#define A(x) case 10+x: printf("10+" #x "\n"); break
(gdb) q

其他提示

我从1992年开始尝试 -g3 并且从未让它做任何有用的事情

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top