2009-09-30 12 views
7

Sto eseguendo il debug di un codice sorgente che ha un sacco di routine # define'd MACRO. Sono interessanti a fare un passo in loro, ma credo che, VC++ non consente la funzionalità step-in ... così,passaggio in MACRO in VC++

  • sto convertirli in funzioni, ma questo sta diventando difficile per me

Esiste un modo per accedere alle routine MACRO? specialmente in VC++?

PS: posso porta l'intero codice in gcc, se il compilatore gcc supporta entrare in MACRO

risposta

3

In aggiunta a tutte le risposte corrette di cui sopra: quello che faccio di solito è quello di mostrare visualizzazione mista (C + montaggio). Questo mostra cosa succede veramente. Anche se non sei esperto nell'assemblaggio sottostante, ti dà un'idea di cosa succede (vale a dire una sostituzione banale o un loop complesso). Inoltre fornirà ulteriori opportunità per accedere alle funzioni. Per esempio, se la macro è

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

il debugger mostrerà qualcosa come loop e che tipo di variabili vengono utilizzati). È possibile utilizzare la definizione macro come riferimento per comprenderlo.

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 
    } 

Ciò fornisce un indizio sul fatto che le variabili i e j sono utilizzate per chiamare la funzione foo_func.

Se si utilizza Visual C++, vi permetterà di entrare in funzioni chiamate da una macro (F11); non dichiarazioni individuali però.

+0

Poiché questo è il più vicino a quello che potrei fare per il mio problema, accetto questa risposta. – Alphaneo

1

Al meglio della mia conoscenza, l'unica debugger che potrebbe passo in macro è fuori dal mercato (SoftICE). Un grande esempio del perché non dovresti scrivere macro a 50 linee, davvero. Quindi, nel complesso ... buona fortuna.

+0

@Micheal, io sono solo il manutentore, e ogni volta che incontro un grande MACRO mi sento come sparare alla persona che ha scritto il codice. – Alphaneo

+0

Hai peggio di tutti, allora. :) –

2

Le macro sono compilate dal preprocessore, in modo che il compilatore sarà in grado di generare informazioni di debug per passare in rassegna le macro.

2

Risposta lunga.

È possibile generare un elenco completo delle macro espanse nelle opzioni del compilatore. Esso potrebbe aiutare un po ', ma non sarà un modo intuitivo debugger

1

Quando si utilizza una macro, il codice dietro si espande tutto alla stessa linea di codice sorgente, per quanto riguarda il debugger è interessato. Il debugger vede MY_MACRO(), e tratta quella singola riga indipendentemente da quanto il codice sia realmente all'interno della macro.

In C++, i modelli possono fare la maggior parte delle cose che le macro possono, ma funzionano molto, molto più elegante. Dal momento che sono una parte reale della lingua, puoi inserirli anche con il debugger! Per esempio:

// 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; 
    } 
} 

Nota: find() è, naturalmente, una funzione di libreria standard, ma ho semplicemente scritto questo per confrontarlo con una macro, per dimostrare come può essere il debug. Per non parlare della versione macro ha molti altri problemi. Regola generale: evitare le macro per scrivere il codice quando possibile!

+0

In primo luogo, Alphaneo utilizza una libreria ed è scomodo modificare tutti i marchi nei modelli. In secondo luogo, i modelli non sono disponibili in C e le persone hanno molti buoni motivi per usare solo C. – user172818

2

Probabilmente la risposta non è utile per gli utenti VC++. Su Unix, faccio qualcosa del genere:

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

i.e., preprocessi il programma e lo riformattassi.