Какой быстрый способ отслеживания входа и выхода функций в многопоточной программе Visual Studio 2005 c ++? - PullRequest
3 голосов
/ 26 октября 2008

У меня периодически возникают сбои в библиотеках ActiveMQ из-за того, что я использую API activemq-cpp. Было бы намного легче отладить проблему, если бы я мог наблюдать за каждой вызываемой функцией, приводящей к сбою. Существуют ли быстрые способы отслеживания входа и выхода функций в многопоточной программе Visual Studio 2005 c ++?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 26 октября 2008

Использовать объект Tracer. Примерно так:


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

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

  const char *functionName_;
};

Теперь вы можете просто создать экземпляр объекта Tracer в верхней части функции, и он автоматически напечатает «выход ...», когда функция завершается и вызывается деструктор:


void foo()
{
  Tracer t("foo");
   ...
}
2 голосов
/ 26 октября 2008

Все вышеперечисленные варианты хороши и могут вам помочь. Но я не понимаю, как настройка TracePoing с помощью мыши может помочь вам, если в вашем коде тысячи функций.
Такие вещи должны быть частью вашей обычной работы по программированию. Когда вы пишете функцию, вы должны подумать, какое сообщение трассировки поможет вам ее отладить.
Вам необходимо написать / использовать существующий регистратор, который может быть разделен на раздел (поток чтения, рабочий поток и т. Д.) И различные уровни ведения журнала (ошибка, предупреждение, трассировка, подробный и т. Д.). Хороший регистратор должен быть спроектирован таким образом, чтобы он не снижал производительность, это обычно наносит ущерб многословности, но сложные проблемы синхронизации обычно можно воспроизвести, если ведение журнала не очень быстрое, например, назначение строкового указателя на массив, который может быть сброшен после проблемы воспроизводится. Я обычно начинаю отладку с полной трассировки, выведенной на экран, и если мне повезет и ошибка воспроизведена таким образом, исправление ошибки является тривиальным, потому что у меня уже есть достаточно информации, веселье начинается, когда проблема исчезает, и вам нужно играть с многословием, чтобы воспроизведите проблему.
Я нахожу отладку более креативной и приятной, чем написание кода, но это только я:).

2 голосов
/ 26 октября 2008

Пока отладчик подключен к процессу, вы можете щелкнуть правой кнопкой мыши в исходном коде и выбрать «точку останова -> добавить TracePoint» с нужным вам текстом (даже некоторые макросы предоставляются).

Tracepoint на самом деле является точкой прерывания с полем «Когда нажата» в некоторых функциях принтера сообщений, и он фактически не прерывает процесс. Я нашел его очень полезным: у него также есть макрос $ FUNCTION, который делает именно то, что вам нужно: вывести функцию, в которой он находится (при условии, что доступна отладочная информация ...), и $ THREADID.

...