C ++ добавление кода отладки, который запускается только при отладке - PullRequest
3 голосов
/ 17 ноября 2010

Как объясняет вопрос: я хотел бы добавить код отладки, который запускается только тогда, когда программа подключена к отладчику. Я бы предположил, что эта переменная flag или pre-processor будет отличаться для каждого компилятора ...

В моем случае я использую Microsoft Visual Studio 2010 с C ++.

Я также использую Eclipse на другом компьютере дома, на котором работает Ubuntu 10.4 и снова в C ++.

Ответы [ 4 ]

3 голосов
/ 17 ноября 2010

Этот вопрос может означать 1 из 2 вещей:

  1. Код, который запускается только на основе конфигурации сборки (например, Release vs. Debug)
  2. Codeзапускается только при подключенном отладчике

На основе конфигурации сборки

Это можно решить с помощью макроса препроцессора, соответствующего вашему компилятору (например, _DEBUG для Win32 CRT ).

В зависимости от того, подключен ли отладчик

Это может быть решено несколькими различными способами.

Globalлогическая переменная

Один из способов, который я нахожу, - это определить глобальную логическую переменную, которая инициализируется false, например:

bool gDebug = false;

И когда я присоединяюсь к кодус моим отладчиком взломайте код и переопределите gDebug с помощью true через окно Watch .Затем вы можете добавить код, который выполняется условно, если задано значение true:

if (gDebug)
{
    // Debugger is attached, so run this code
    // ...
}

Ключ реестра

Определить значение реестра DWORD, которое инициализируется в 0, но вы можете переопределить на 1 через редактор реестра.

Затем вы устанавливаете свой код отладки в качестве условия для этого значения реестра, установленного на 1. Это может быть лучшей альтернативой, так как вы можете контролировать этовнешнее значение без необходимости ломать в вашем отладчике для установки глобальной переменной в соответствующее время.

2 голосов
/ 17 ноября 2010

Если вы хотите, чтобы какой-либо код был включен или не включен в сборки отладки / выпуска, обычно макрос препроцессора _DEBUG определяется для сборок отладки (по крайней мере, в MSVC ++ CRT, который является соглашением), но он не определяет если отладчик подключен, он просто позволяет вам включить другой код для сборок отладки / выпуска.

Если вам нужна проверка времени выполнения для подключенных отладчиков, вам следует использовать IsDebuggerPresent API, который определяет, подключен ли отладчик пользовательского режима.

Обратите внимание, что это не на 100% надежно, так как при некоторой не такой сложной работе отладчик может заставить его лгать вашему приложению. Другими словами, это не очень хорошо для защиты / защиты от мошенничества и подобных вещей, это больше для того, чтобы включить дополнительную помощь отладчику (например, как говорит сама страница, выводить больше диагностической информации с помощью OutputDeubgString, так далее.). Более того, он не обнаружит отладчики в режиме ядра, которые в любом случае могут делать что хотят.

Во всяком случае, я советую вам избегать использования этой функции для сложных вещей, так как вы вводите разные пути кода, когда отладчик подключен, и это может затруднить отладку «странных» ошибок. Весь код, который я использовал косвенным образом и который представлял такое поведение (например, почти недокументированная куча отладки Windows), всегда вызывал у меня сильные головные боли.

0 голосов
/ 17 ноября 2010

Существует еще более прямой подход к этому. Вы можете вручную вызвать функцию по вашему выбору во время сеанса отладчика:
http://sourceware.org/gdb/onlinedocs/gdb/Calling.html

С уважением,
Marcin

0 голосов
/ 17 ноября 2010

Установите глобальную переменную in_debugger на false в вашей программе.Условие, что весь ваш код только для отладки этой переменной: true.Установите переменную на true при подключении отладчика.

...