Исходный код модуля не соответствует пути выполнения кода при достижении точки останова

Я отлаживаю фильтр DirectShow, созданный с помощью библиотеки кода DSPACK, используя Delphi 6 Pro. Когда установленная мной точка останова достигается в одном конкретном модуле с именем BaseClass.pas и я начинаю трассировку, точка выполнения перескакивает в странные места в исходном коде. Обычно это указывает на то, что отслеживаемый исходный код не соответствует исходному коду, который был скомпилирован в один из пакетов, используемых приложением Delphi. Как ни странно, это только модуль BaseClass, поскольку я отследил другие модули, принадлежащие библиотеке кода DSPACK, и они не проявляют этой проблемы. Я не использую пакеты времени выполнения.

Я просканировал свой диск и нашел только одну копию BaseClass.dcu с датой модификации, равной дате последней сборки программы. Я не изменял источник для этого устройства или любого другого, принадлежащего DSPACK. Поскольку мой фильтр является частью основного приложения, это указывает на то, что BaseClass.pas будет подвержен ситуации двойного использования, поскольку он используется для создания пакета компонентов DSPACK (dpk), а также на него ссылается мое основное приложение напрямую через объект TBCSource мой фильтр происходит от. Обратите внимание: я попытался добавить файл PAS модуля непосредственно в свой проект, но это ничего не помогло.

Я также вернулся и повторно открыл каждый из файлов пакета DSPACK и выполнил полную перекомпоновку. Ничего из этого не помогло. Есть ли что-то еще, что я могу попытаться синхронизировать источник со скомпилированным изображением модуля BaseClass? Или это совсем другая проблема, и если да, то что это и как исправить?


person Robert Oschler    schedule 28.10.2011    source источник


Ответы (4)


Иногда это происходит, когда код копируется / вставляется с веб-страниц или других источников, и строки не заканчиваются парами CR/LF (#13#10 или 0x0D0A, стандартно для Windows), а заканчиваются только LF (#10 или 0x0A, обычно строка заканчивается на * nix systems) или CR (#13 или 0x0D, типично для Mac OSX / iOS). Неправильные указатели конца строки сбивают с толку отладчик - это было проблемой в последних нескольких версиях Delphi.

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

person Ken White    schedule 28.10.2011
comment
Спасибо, что напомнили мне об этом. Я только что попробовал ваше предложение, к сожалению, без изменений. - person Robert Oschler; 29.10.2011
comment
Я вспомнил, что давно написал служебную программу специально для очистки файлов Delphi от любых ненужных символов и для обеспечения того, чтобы все символы конца строки были настоящей парой CRLF. Я нашел его и запустил на BaseClass.pas, и ошибка исчезла. Таким образом, сохранения / перезагрузки Блокнота явно недостаточно в некоторых ситуациях, но это была проблема с нежелательным персонажем. К сожалению, потерял несколько часов, но рад, что это исправлено. - person Robert Oschler; 29.10.2011
comment
:) Вот почему я сказал иногда и не только можно исправить. Рад, что смог помочь, даже если немного. - person Ken White; 29.10.2011

У меня была такая же проблема, и я сделал аналогичную утилиту. Починил это. В основном, как раз это:

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;
person Jose    schedule 09.12.2011
comment
Спасибо, это работает! Я попробовал трюк с Блокнотом, и это не помогло. Но ваш трюк работает. - person alitrun; 08.12.2019

Это может произойти и по-другому: если среда IDE по ошибке открывает другой исходный файл с тем же именем (но другим, например, более ранней версии), то все точки отладки будут неверными, и отладчик даже позволит вам пройти через неправильный файл. Я однажды видел, как Delphi 7 делал это.

person SDL    schedule 21.01.2015

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

Кроме того, если вы еще этого не сделали, перезапустите Delphi.

person Marcus Adams    schedule 28.10.2011
comment
Хорошая идея, но я еще раз проверил, действительно есть отладочная информация. - person Robert Oschler; 29.10.2011