代码之家  ›  专栏  ›  技术社区  ›  Don Wakefield

GNU编译器调试“级别”

  •  0
  • Don Wakefield  · 技术社区  · 16 年前

    在浏览我的编译器(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),然后在编译的代码-g3上尝试了商业调试器TotalView和GDB。我没有看到任何区别(宏没有扩展到它们的原始代码,我不能“单步进入”宏,等等)。

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

    2 回复  |  直到 16 年前
        1
  •  3
  •   Employed Russian    16 年前

    您的问题似乎暗示您不了解宏是什么。 当然 您不能单步执行宏。

    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
    
        2
  •  2
  •   Norman Ramsey    16 年前

    我有 尝试 -g3 从1992年开始断断续续地 从未让它做过有用的事