Qual è un modo rapido per tracciare l'ingresso e l'uscita delle funzioni in un programma multithreading c ++ di Visual Studio 2005?

StackOverflow https://stackoverflow.com/questions/238517

Domanda

Ho dei crash intermittenti che si verificano nelle mie librerie ActiveMQ a causa del modo in cui sto usando l'API activemq-cpp. Sarebbe molto più facile eseguire il debug del problema se potessi osservare ogni funzione chiamata che porta al crash. Esistono modi rapidi per tracciare l'ingresso e l'uscita delle funzioni in un programma multithreading c ++ di Visual Studio 2005?

Grazie in anticipo!

È stato utile?

Soluzione

Usa un oggetto Tracer. Qualcosa del genere:


class Tracer
{
public:
  Tracer(const char *functionName) : functionName_(functionName)
  {
    cout << "Entering function " << functionName_ << endl;
  }

  ~Tracer()
  {
    cout << "Exiting function " << functionName_ << endl;
  }

  const char *functionName_;
};

Ora puoi semplicemente creare un'istanza di un oggetto Tracer nella parte superiore della funzione, che stamperà automaticamente " uscendo ... " quando la funzione viene chiusa e viene chiamato il distruttore:


void foo()
{
  Tracer t("foo");
   ...
}

Altri suggerimenti

Mentre il debugger è collegato a un processo, puoi fare clic con il tasto destro del mouse sul codice sorgente e selezionare " breakpoint- > aggiungere TracePoint " ;, con il testo desiderato (anche alcune macro sono fornite).

Il Tracepoint è in realtà un BreakPoint con " When Hit " su alcune funzionalità della stampante di messaggi e in realtà non interrompe il processo. L'ho trovato molto utile: ha anche una macro $ FUNCTION, che fa esattamente quello che ti serve: stampa la funzione in cui si trova (a condizione che abbia le informazioni di debug disponibili ...) e $ THREADID.

Tutte le opzioni sopra sono belle e possono aiutarti. Ma non riesco a vedere come l'impostazione di TracePoing con il mouse può aiutarti nel caso in cui il codice abbia migliaia di funzioni.
Questo genere di cose dovrebbe far parte del normale lavoro di programmazione. Quando scrivi una funzione dovresti pensare a quale messaggio di traccia ti aiuterà a eseguire il debug.
È necessario scrivere / utilizzare un logger esistente che può essere suddiviso in sezioni (thread del lettore, thread di lavoro, ecc ...) e diversi livelli di registrazione (errore, avviso, traccia, dettagliato ecc.). Il buon logger dovrebbe essere progettato in modo che non danneggi le prestazioni, questo di solito danneggia la verbosità, ma i problemi di sincronizzazione complessi di solito possono essere riprodotti a meno che la registrazione non sia molto veloce, come l'assegnazione di un puntatore di stringa all'array che può essere scaricato dopo il problema è riprodotto. Di solito comincio a eseguire il debug con la traccia completa scaricata sullo schermo e se sono fortunato e ho riprodotto un bug in questo modo, correggere il bug è banale perché ho già abbastanza informazioni, il divertimento inizia quando il problema scompare e devi giocare con verbosità per riprodurre il problema.
In realtà trovo il debug più creativo e soddisfacente della scrittura di codice, ma questo sono solo io :).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top