#delphi #debugging #breakpoints
#delphi #отладка #точки останова
Вопрос:
Я отлаживаю фильтр DirectShow, который я создал с помощью библиотеки кода DSPACK, используя Delphi 6 Pro. Когда установленная мной точка останова попадает в один конкретный модуль с именем BaseClass.pas, и я начинаю трассировку, точка выполнения переходит в странные места в исходном коде. Обычно это указывает на то, что отслеживаемый исходный код не соответствует исходному коду, который был скомпилирован в один из пакетов, используемых приложением Delphi. Как ни странно, это только элемент базового класса, поскольку я отследил другие блоки, принадлежащие библиотеке кода DSPACK, и они не обнаруживают этой проблемы. Я не использую пакеты времени выполнения.
Я просканировал свой диск и нашел только одну копию BaseClass.dcu с датой изменения, равной дате последней сборки программы. Я не изменял исходный код для этого модуля или любого другого, принадлежащего DSPACK. Поскольку мой фильтр является частью основного приложения, это указывает на то, что файл BaseClass.pas будет использоваться в ситуации двойного использования, поскольку он используется для сборки пакета компонентов DSPACK (dpk), а также ссылается на мое основное приложение напрямую через объект TBCSource, из которого происходит мой фильтр. Обратите внимание, я пытался добавить файл PAS-файла unit непосредственно в свой проект, но это ничего не исправило.
Я также вернулся и повторно открыл каждый из файлов пакета DSPACK и выполнил полную перестройку. Ничего из этого не помогло. Есть ли что-то еще, что я могу попытаться синхронизировать исходный код со скомпилированным образом модуля базового класса? Или это совсем другая проблема, и если да, то что это такое и как я могу это исправить?
Ответ №1:
Иногда это происходит, когда код копируется / вставляется с веб-страниц или других источников, и строки не заканчиваются CR/LF
парами ( #13#10
или 0x0D0A
, стандартно для Windows), а заканчиваются только LF ( #10
или 0x0A
, как правило, строка, заканчивающаяся на * nix systems) или CR ( #13
или 0x0D
, типично для Mac OSX / iOS). Неправильные терминаторы строк сбивают с толку отладчик — это было проблемой для последних нескольких версий Delphi.
Иногда это можно исправить, открыв исходный файл с помощью текстового редактора, такого как Блокнот, внеся небольшое бессмысленное изменение (например, вставьте, а затем удалите пустую строку), а затем сохраните файл.
Комментарии:
1. Спасибо, что напомнили мне об этом. Я только что попробовал ваше предложение, к сожалению, без изменений.
2. Я вспомнил, что давным-давно написал утилиту специально для очистки файлов Delphi от любых ненужных символов и для обеспечения того, чтобы все символы в конце строки были истинной парой CRLF. Я нашел его и запустил в BaseClass.pas, и ошибка исчезла. Таким образом, в некоторых ситуациях сохранения / перезагрузки блокнота недостаточно, но это была проблема с нежелательными символами. К сожалению, потерял несколько часов из-за этого, но рад, что это исправлено.
3. 🙂 Вот почему я сказал «иногда», а не просто «Вы можете исправить». Рад, что смог помочь, даже если это было немного.
Ответ №2:
У меня была такая же проблема, и я создал аналогичную утилиту. Исправлено. В принципе, только это:
procedure adjustCRLF(filename : String);
var
strList : TStringList;
begin
strList := TStringList.Create;
try
strList.LoadFromFile(filename);
strList.Text := AdjustLineBreaks(strList.Text);
strList.SaveToFile(filename);
finally
strList.Free;
end;
end;
Комментарии:
1. Спасибо, это работает! Я попробовал трюк с Блокнотом, и это не помогло. Но ваш трюк работает.
Ответ №3:
Это может произойти и другим способом: если среда IDE ошибочно откроет другой исходный файл с тем же именем (но другой, например, более ранней версии), тогда все точки отладки будут неверными, и отладчик даже позволит вам перейти к неправильному файлу. Я видел, как Delphi 7 делал это один раз.
Ответ №4:
Убедитесь, что при его перестройке в параметрах компилятора для вашего проекта включена опция «Отладочная информация». Фактически, большинство параметров в разделе «Отладка» должны быть установлены в параметрах компилятора вашего проекта.
Кроме того, если вы еще этого не сделали, перезапустите Delphi.
Комментарии:
1. Хорошая идея, но я проверил еще раз, информация об отладке действительно включена.