O que é uma maneira rápida para rastrear a entrada e saída de funções em um Visual Studio 2005 c ++ programa multithread?

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

Pergunta

Eu tenho bloqueios intermitentes que ocorrem em minhas bibliotecas activemq devido à maneira que eu estou usando a API activemq-CPP. Seria muito mais fácil de depurar o problema se eu pudesse observar cada função que está sendo chamado que antecederam o acidente. Há alguma maneira rápida para rastrear a entrada e saída de funções em um programa c ++ multithreaded Visual Studio 2005?

Agradecemos antecipadamente!

Foi útil?

Solução

Use um objeto Tracer. Algo parecido com isto:


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

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

  const char *functionName_;
};

Agora você pode simplesmente instanciar um objeto Tracer no topo da função, e ele vai imprimir automaticamente "sair ..." quando sai de função e o destruidor é chamado:


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

Outras dicas

Enquanto o depurador é anexado a um processo, você pode rightclick no código-fonte e selecione "breakpoint-> adicionar TracePoint", com o texto que deseja (até mesmo alguns de macro são fornecidos).

O Tracepoint é na verdade um ponto de interrupção com o campo "Quando Hit" em algumas funcionalidades de impressora mensagem, e ele realmente não quebrar o processo. Eu encontrei-poderoso útil: ele também tem uma macro $ FUNÇÃO, que faz exatamente o que você precisa: imprimir a função é no (desde que tenha a informação de depuração disponíveis ...), e um $ ThreadID

.

Todas as opções acima agradável e pode ajudá-lo. Mas eu não posso ver como a criação TracePoing com o mouse pode ajudá-lo no caso de você código tem milhares de funções.
Esse tipo de coisa deve ser parte de seu trabalho de programação regular. Quando você escrever uma função que você deve pensar o que mensagem de rastreamento vai ajudar você a depurá-lo.
Você precisa escrever / uso logger existente que pode ser cuspido para a seção (thread leitor, segmento de trabalho, etc ...) e diferentes níveis de log (erro, aviso, traço, detalhado etc ..). A boa logger deve ser concebido na forma como ele não está te machucar desempenho, isso geralmente prejudicar a verbosidade, mas problemas de sincronização complexos geralmente pode ser reproduzida a menos que o registro é muito rápido, como a atribuição de um ponteiro de string para a matriz que pode ser despejado após problema é reproduzido. Eu costumo iniciar a depuração com traço cheio despejado para a tela e se eu tiver sorte e bug reproduzido Desta forma, corrigir o bug é trivial porque eu já tenho informação suficiente, a diversão começa quando o problema vai embora e você precisa jogar com verbosidade, a fim de reproduzir o problema.
Eu realmente encontrar a depuração mais criativo e gratificante do que escrever código, mas isso é apenas me:).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top