В Delphi: Как пропустить фрагменты кода при отладке? - PullRequest
14 голосов
/ 16 января 2009

Я часто случайно захожу в код, который мне не интересен при отладке в Delphi.

Давайте начнем с того, что я знаю, что вы можете перейти с помощью F8 и что вы можете перейти к определенной строке с помощью f4.

Пример:

function TMyClass.DoStuff():Integer;
begin
  // do some stuff
  bla();
end;

procedure TMyClass.Foo()
begin
  if DoStuff()=0 then // press F7 when entering this line
    beep;
end;

Пример: я хочу перейти к методу DoStuff (), нажав F7, но вместо того, чтобы идти туда, я сначала попадаю в FastMM4.FastGetMem (), который представляет собой большой массив кода сборки, который, очевидно, меня не интересует в данный момент.

Есть несколько способов сделать это, и мне не нравится ни один из них:

  • Добавить точку останова на " bla " (почти бесполезно, если вы хотите заходить в DoStuff только в особых случаях, например, итерации 23498938);

  • Вместо нажатия клавиши F7 вручную переместите курсор на « bla » и нажмите клавишу F4 (работает для этого простого примера. На практике это не так);

  • В случае FastMM: временно отключить fastmm;

Есть ли способ намекнуть IDE, что я никогда не заинтересован в переходе в определенный блок кода, или мне всегда нужно устанавливать дополнительные контрольные точки или использовать F4, чтобы попытаться избежать этого?

Я надеюсь на какую-нибудь магическую директиву компилятора, такую ​​как {$ NODEBUG BEGIN / END} или что-то в этом роде.

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

Обновление: возможно, codegear должен ввести что-то вроде skip-points (в отличие от точек останова): -)

Ответы [ 8 ]

24 голосов
/ 16 января 2009

Есть "магический переключатель нодбаг". {$ D-} отключит генерацию кода отладки. Поместите это наверх вашего устройства FastMM, и вы не будете в конечном итоге прослеживать его. И если вы окажетесь в функции, в которой вы не хотите участвовать, SHIFT-F8 вытащит вас очень быстро. ( ПРЕДУПРЕЖДЕНИЕ: Не используйте SHIFT-F8 из подпрограммы кода сборки, которая работает со стеком. Это может привести к непредсказуемому поведению. F4 вместо этого.)

7 голосов
/ 16 января 2009

Если вы переходите к коду FastMM, то происходят операции с памятью. Код, который вы показали, не имеет никаких операций с памятью, поэтому ваш вопрос не завершен. Я постараюсь угадать, что ты имел в виду.

Когда подпрограмма имеет локальные переменные управляемых компилятором типов (таких как строки, интерфейсы или динамические массивы), пролог функции выполняет нетривиальную работу. В прологе также настраиваются контрольные значения входных параметров. Отладчик представляет пролог в строке begin функции. Если текущая точка выполнения - это та строка, и вы «входите» в нее, вы попадете в код RTL для управления специальными типами. (Я бы тоже не ожидал, что там будет задействован FastMM, но, может быть, все изменилось по сравнению с тем, к чему я привык.) В этой ситуации легко сделать «перешагнуть» строку begin вместо Это; используйте F8.

Если вы действительно нажимаете F7, когда вводите выделенную строку, значит, вы делаете это неправильно. Это шаг в строку begin, , а не строку, где вызывается DoStuff. Так что, если вы попадете в код FastMM, это не имеет ничего общего с реализацией DoStuff. Для отладки вызова на DoStuff текущая точка выполнения должна уже быть строкой с вызовом на ней.

Если вы хотите отлаживать DoStuff только на итерации 23498938, тогда вы можете установить условную точку останова в этой функции. Щелкните в желобе, чтобы создать нормальную точку останова, а затем щелкните ее правой кнопкой мыши, чтобы отобразить его свойства. Там вы можете определить условие, которое будет оцениваться каждый раз, когда выполнение достигает этой точки. Отладчик остановится только тогда, когда условие выполнено. Нажмите F8, чтобы «перешагнуть» вызов DoStuff, и если условие истинно, отладчик остановится там, как если бы вы нажали F7 вместо этого.

Вы можете переключать опцию «использовать отладочные DCU», чтобы не входить в большинство блоков RTL и VCL. Я не знаю, включен ли FastMM в этот набор. Основное различие заключается в том, были ли скомпилированные DCU с отладочной информацией. Этот параметр изменяет путь к библиотеке , чтобы включить или исключить подкаталог, в котором находятся отладочные DCU. Я думаю вы можете настроить набор включенных или исключенных каталогов отладки так, чтобы пользовательский набор каталогов добавлялся или удалялся на основе параметра «отладочные DCU».

Вернуться к точкам останова. Вы можете настроить группы точек останова , назначив имена точкам останова. Вы можете использовать расширенную точку останова, чтобы включить или отключить именованную группу точек останова при ее передаче. (Группы точек останова могут иметь только одну точку останова, если хотите.) Так, например, если вы хотите разрывать только в местоположении X, если вы также прошли какое-то другое местоположение Y в вашей программе, вы можете установить отключенную точку останова в X и неразрывную точку останова на Y. Установите настройку «включить группы» на Y, чтобы включить группу X.

Вы также можете воспользоваться отключенными точками останова без автоматического включения и выключения. Ваши точки останова появляются в окне отладчика «точки останова». Если вы проходите через DoStuff и решите, что хотите проверить bla на этот раз, перейдите к окну точки останова и включите точку останова на bla. Нет необходимости переходить к реализации bla, чтобы установить точку останова.

Подробнее о расширенных точках останова см. Использование неразрывных точек останова в Delphi и статью Кэри Дженсена, опубликованную несколько лет назад.

6 голосов
/ 16 января 2009

Возможно, я что-то пропустил в вашем посте, но с FastMM4 вы можете отредактировать включаемый файл FastMM4Options.Inc и удалить «.» из следующего определения:


Из FastMM4Options.inc ****

{Включите эту опцию, чтобы отключить генерацию отладочной информации для Блок FastMM4.pas. Это предотвратит вход встроенного отладчика в код менеджера памяти.}

{$. Define NoDebugInfo}


При перекомпиляции (может потребоваться сборка) отладчик больше не будет (должен) отлаживать код FastMM.

4 голосов
/ 16 января 2009

Используйте предварительно скомпилированный неотладочный DCU FasmMM

3 голосов
/ 13 октября 2011

В файле проекта dpr я использую

uses
{$IFNDEF DEBUG} FastMM4, {$ENDIF}
  ... // other units

для исключения FastMM4 в режиме отладки. Не требует никаких изменений в FastMM4, поэтому мне не нужно добавлять {$ D-} в FastMM при переходе на другую версию.

2 голосов
/ 16 января 2009

Хотя это и не является прямым ответом на ваш вопрос, вы можете изменить первое предложенное решение, указав точку останова на bla, которая активируется только при прохождении точки останова на Foo (или другое условие по вашему выбору, например, итерация рассчитывать). Тогда он сломается только тогда, когда вы захотите.

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

2 голосов
/ 16 января 2009

AFAIK, отладчик знает только файлы в пути просмотра, которые вы можете изменить в настройках. Поэтому, если вы исключите пути модулей, вы не заинтересованы в отладке, которая даст эффект того, что вы хотите сделать.

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

0 голосов
/ 16 января 2009

Нет. Я не верю, что есть способ сказать отладчику никогда не останавливаться в определенной части кода. Нет магической директивы.

Лучшее, что вы можете сделать, когда попадаете в рутину, в которой не хотите участвовать, - это использовать Shift + F8, которая будет работать до возврата. Затем выполните F7 или F8 для выхода из процедуры.


Хм. Теперь я вижу ответ Мейсона. Узнал что-то. Спасибо, Мейсон. + 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...