2009-09-30 4 views
7

大きな#defineされたMACROルーチンを持つソースコードをデバッグしています。 私は関数に変換していますが、これは私 のために懸命になってきているので、VC++でMACROを実行しています

  • ... VC++は、ステップイン機能を許可していない、私はそれらに足を踏み入れるで興味深いが、私は推測

    MACROルーチンにステップインする方法はありますか?特にVC++で?

    PS:GCCコンパイラはマクロにステップできる唯一のデバッガが廃業で、私の知る限りMACRO

答えて

3

上記のすべての正しい答えに加えて:私は通常、混合表示(C +アセンブリ)を表示します。これは本当に何が起こったかを示していますあなたが基礎となるアセンブリの専門家でなくても、何が起こるかを考えています(つまり、それは簡単な交換または複雑なループです)。また、機能に足を踏み入れる機会も増えます。たとえば、あなたのマクロは

#define foo(a) i++;foo_func(a,i) 

あなたのデバッガが) ループのようなものが表示され、変数の種類が使用されている場合。マクロ定義を参照として使用して、それを理解することができます。

00411454 mov   dword ptr [j],eax 
00411457 cmp   dword ptr [j],0Ah 
0041145B jge   wmain+58h (411478h) 
    { 
     foo(j); 
0041145D mov   eax,dword ptr [i] 
00411460 add   eax,1 
00411463 mov   dword ptr [i],eax 
00411466 mov   eax,dword ptr [i] 
00411469 push  eax 
0041146A mov   ecx,dword ptr [j] 
0041146D push  ecx 
0041146E call  foo_func (411028h) 
00411473 add   esp,8 
    } 

これは、iとj変数は、関数foo_funcを呼び出すために使用されていることを手掛かりを与えます。

Visual C++を使用すると、マクロ(F11)から呼び出された関数にステップインできます。しかし、個々のステートメントではありません。

+0

これは私の問題のためにできることに最も近いので、私はこの答えを受け入れています。 – Alphaneo

1

に(のSoftICEを)ステッピングサポートしている場合、私は、gccのにポート全体のコードをすることができます。なぜ、本当に50行マクロを書くべきではないかという素晴らしい例です。だから、全体的に...幸運。

+0

@Micheal、私はメンテナーに過ぎず、コードを書いた人を撃つような大きなMACROを感じるたびに、 – Alphaneo

+0

あなたは誰よりも悪いです。 :) –

2

マクロはプリプロセッサによってコンパイルされるため、コンパイラはマクロをステップインするデバッグ情報を生成できません。

2

長い答えです。 No.

コンパイラオプションで展開されたマクロの完全なリストを生成することができます。これは幾分助けになるかもしれませんが、デバッガの機能を提供しません

1

マクロを使用すると、その背後にあるコードは、デバッガに関する限り、すべて同じソースコード行に展開されます。デバッガはMY_MACRO()を見て、どれだけのコードが本当にマクロの中にあってもその1行を扱います。

C++では、テンプレートはマクロのほとんどを実行できますが、はるかに上品に動作します。彼らは言語の本質的な部分なので、デバッガを使用して、彼らに手を差し伸べることもできます!たとえば:

// Macro FIND() - ugly, buggy, and can't ever be stepped in to by debugger! 
#define FIND(begin, end, value) \ 
{ \ 
    for (; begin != end; ++begin) { \ 
     if (*begin == value) \ 
      break; \ 
    } \ 
} 

// Templated find() - works beautifully and can be debugged like a real function! 
template<typename Iter, typename T> 
Iter find(Iter begin, Iter end, const T& value) 
{ 
    for (; begin != end; ++begin) { 
     if (*begin == value) 
      return begin; 
    } 
} 

注:見つけるには、()もちろん、標準ライブラリ関数ですが、私は単にそれをデバッグできる方法を示すために、マクロにそれを比較するために、これを書いています。マクロ版には、他にも多くの問題があります。経験則:可能な限り、コードを記述するためのマクロは避けてください!

+0

まず、Alphaneoはライブラリを使用しています。すべてのマルクロをテンプレートに変更するのは厄介です。第二に、テンプレートはC言語では利用できず、人々はC言語のみを使う多くの理由があります。 – user172818

2

おそらく私の答えはVC++ユーザーには役に立ちません。 Unixでは、私は次のようなことをします:

gcc -E prog.c | indent > prog-formatted.c 

i。つまり、プログラムを前処理して再フォーマットします。

関連する問題