C / C ++ в Eclipse, могу ли я использовать #define для установки точки останова, но только при пошаговом выполнении кода? - PullRequest
1 голос
/ 22 февраля 2010

Несколько лет назад у меня было немного #define, которое я использовал в Borland C ++ Builder. По памяти это было что-то приблизительно как

 #define BREAK_IF_DEBUGGING asm(0xA3);

или что-то в этом роде. Он полагался на то, что 0XA3 (или что бы то ни было) был кодом операции для прерывания, которое Borland использовал для запуска точки останова.

Могу ли я сделать то же самое в Eclipse? (Я, вероятно, заверну это в несколько #idef ECLIPSE и #ifdef TESTING)

Что я надеюсь достичь здесь, так это
- конечно, код не компилируется в релизной версии.
- если я запускаю модульные тесты с помощью Ctrl-F11, то я не хочу, чтобы была запущена точка останова (чего не происходит из-за того, что Ctrl-F11 является "Run")
- если я "Запущу с отладкой", используя F11), то, если выполнение попадет в какое-либо использование макроса, он остановится на точке останова.

Почему? Потому что я хочу установить и забыть. Просто вставьте один из них в каждую ветку ошибки (или вставьте ее в мой макрос LOG_ERROR).

Часто, когда я выбираю свою начальную точку останова, это слишком поздно, поэтому этот макрос говорит: «Я думаю, что я хочу перейти к строке X, но если выполнение проходит сначала через одну из этих ветвей ошибок, я бы хотел на этом остановиться & обнюхивать ".

Нравится ли вам идея или нет, вы можете сказать мне, как это сделать?

Ответы [ 4 ]

3 голосов
/ 22 февраля 2010

а как же

#define BREAK_IF_DEBUGGING asm("int3");

(отсутствие пробела между int и 3 является преднамеренным: int 3, кодируемый не так, как другие прерывания, ассемблер gnu помечает эту разницу с помощью этого специального синтаксиса)

1 голос
/ 22 февраля 2010

Если вы работаете в операционной системе Unix, вы можете сделать что-то вроде:

raise(SIGTRAP); 
1 голос
/ 22 февраля 2010

Вы можете использовать функцию Windows IsDebuggerPresent (см. http://msdn.microsoft.com/en-us/library/ms680345%28VS.85%29.aspx), чтобы проверить, подключен ли отладчик к вашему процессу.

Если отладчик подключен, вы можете использовать функцию BreakPoint для запуска точки останова.

0 голосов
/ 22 февраля 2010

Как насчет

определить BREAK_IF_DEBUGGING assert (false);

Очевидно, что вы можете лучше использовать assert ().

...