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

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

Вопрос

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

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

Это было полезно?

Решение

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


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

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

  const char *functionName_;
};

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


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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top