0

コンパイラのさまざまなオプション スイッチを参照しているときに (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 を使用して追加のデバッグ「機能」を取得した経験のある人はいますか?

4

2 に答える 2

3

あなたの質問は、マクロが何であるかを理解していないことを暗示しているようです。もちろん、マクロにステップインすることはできません。

-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
于 2009-01-06T08:57:18.140 に答える
2

私は1992 年以来何度も何度も試し-g3てきましたが、何か役に立つことはありませんでした

于 2008-12-31T22:57:31.483 に答える