Приложение Delphi не имеет "отладочной информации" при отладке

мы создали приложение, которое использует пакеты и компоненты. Когда мы отлаживаем приложение, "журнал событий"в IDE часто показывает, что наши BPLs загружаются без отладочной информации ("нет отладочной информации"). Это не имеет смысла, потому что все наши пакеты и EXEs построены с debug.

_(each project) | Options | Compiling_
[ x ] Assertions
[ x ] Debug information
[ x ] Local symbols
Symbol reference info = "Reference info"
[   ] Use debug .dcus
[ x ] Use imported data references

_(each project) | Options | Linking_
[ x ] Debug information
Map file = Detailed

У нас есть 4 проекта, все построены с помощью runtime pacakges:

  1. ядра.bpl
  2. компоненты.bpl
  3. плагин.bpl (использует оба #1 & #2)
  4. MainApp.exe (использует #1)

Проблем

1) много раз, когда мы отладка компонентов.bpl загружен отладочной информацией, но все значения в окне "локальные переменные" пусты. Если вы наведете курсор мыши на переменную в коде, всплывающего окна не будет, а окно оценки также ничего не покажет (панель "результат" всегда пуста).

2) Иногда журнал событий показывает "нет отладочной информации" для различных BPLs. Для например, если мы активируем плагин.проект bpl и установить его запуск | параметр хост-приложения, чтобы быть MainApp.exe, а затем нажмите F9, все модули, похоже, загружаются с "отладочной информацией", за исключением плагина.модуль БПЛ. Когда он загружается, журнал событий показывает "нет отладочной информации". Однако, если мы закроем приложение и сразу же нажмем F9, оно снова запустится без перекомпиляции и на этот раз плагина.bpl загружен debug ("имеет Debug Информация.)"

вопросы

1) что вызовет окно "локальные переменные" в не отображения значений?

2) Почему bpls иногда загружаются без отладочной информации, когда BPL был выполнен с debug и всеми отладочными файлами (dcu, map и т. д.) доступны?

7 ответов


мы столкнулись с аналогичной проблемой в нашем проекте. К сожалению, у нас есть десятки bpl, поэтому мы не можем объединить их в одном. Эта проблема появилась после того, как мы перешли на XE2 и изменили структуру папок нашей цели компиляции. Хотя трудно сказать, если новые версии Delphi ввели проблему или нет, мы могли бы исправить эту проблему, добавив папку, в которой bpls компилируются в переменной среды path. Использование функции переопределения пути IDE. Этот тип конфигурации был не обязательно в Delphi 2010...


я бы описал свою проблему с ним.

я динамически загружаю пакет с помощью .

я вижу в SysInternals.com Process Monitor это имя пакета.DCP открылся и успешно прочитал после LoadPackage обработано - нет файла ввода-вывода не удалось, нет попытки найти его в неправильных местах, ничего подозрительного. возможно, в DCP есть какая-то конструкция, которая заставляет отладчик IDE сходить с ума. Я тоскую по временам, когда Turbo Debugger был доступен для Delphi.

кстати, то же самое для имя_пакета.RSM один создает такое.

затем (во время паузы в точке останова или трассировке шага) я открываю Просмотр / Отладка Окон / Модулей и см. последний модуль мой-и он имеет пустую ячейку "информация о символе". Я щелкните его правой кнопкой мыши, выберите "повторная загрузка символов" действие - и вот оно, теперь я могу отладки.

PS. Не знаю, если это поможет мне отладить секции инициализации, хотя, надеюсь,"break on load" пункт меню будет работать даже с динамический LoadPackage звонки...

PPS. Он действительно работает, даже при перезапуске IDE. Так что теперь я предупрежден при загрузке BPL с CPU View, Я CTRL+ALT+M, прокрутите вниз, чтобы найти мой BPL, r-click to Reload Symbols, нажмите Enter, затем закройте Modules и CPU вид и нанести удар F9 (Run). После initialization завершает разделы я снова предупрежден CPU View - просто несколько JMPs Перед выходом из LoadPackage - Так я рядом CPU View и stike F9 еще раз. Довольно утомительно, но все же лучше. чем перезапуск IDE.


этой неофициальный инструмент устраняет многие проблемы с Delphi. Он исправил загрузку модуля без debug info Для меня. Все кредиты magicandre1981.


вы должны создать свои отдельные пакеты с отладочной информацией, и вы в конечном итоге захотите построить их без отладки - так что у вас будет и в 2 местах. Затем вы хотите создать свой проект приложения с помощью debug info. Проверьте пути, чтобы убедиться, что источник пакета с поддержкой отладки включен в сборки проекта отладки. Похоже, вы можете включать пакеты, которые были построены без отладки, потому что вы включаете из неправильного источника. Вы должны убедиться, что у вас нет оба пути включены, оставляя Delphi выбирать, что включать, если он находит один и тот же пакет в двух местах.


для нашей конкретной ситуации мы смогли исправить проблему, объединив ядро.ПБЛ и комплектующие.bpl в один BPL. Теперь все модули загружаются с отладочной информацией, и случайная проблема, когда окно Locals не будет отображать значения для переменных, решена.


эта проблема может быть выпущена в QC#109291:

когда Delphi IDE начнет вводить .файл dproj и конфигурация сборки с наборами опций, это значительно улучшает управление выпуском проекта.

однако он также имеет побочный эффект, который трудно воспроизвести и поймать, и я думал, что это ошибки в IDE. Проблема должна всегда путать пользователей, где какой-то проект не может отлаживаться в отладчике IDE. Даже мы проверяем все связанные настройки компилятор и параметры связывания в project, отладчик не будет активироваться в проекте. Какой-то проект работает, а какой-то нет. Мы даже считаем, что это проблема памяти или проблема процессора.

я заметил, что проблема связана с.параметр файла dproj не хранит правильную информацию. Если связанные .dproj файл имеет что-то вроде этого:

<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''">
    <Cfg_1>true</Cfg_1>
    <CfgParent>Base</CfgParent>
    <Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''">
    <Cfg_2>true</Cfg_2>
    <CfgParent>Base</CfgParent>
    <Base>true</Base>
</PropertyGroup>

<Import Project="Release.optset" Condition="'$(Cfg_2)'!='' And Exists('Release.optset')"/>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
    <CfgDependentOn>Release.optset</CfgDependentOn>
</PropertyGroup>
<Import Project="Debug.optset" Condition="'$(Cfg_1)'!='' And Exists('Debug.optset')"/>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
    <CfgDependentOn>Debug.optset</CfgDependentOn>
</PropertyGroup>

на Release.optset привязать к Cfg_2 и Debug.optset привязать к Cfg_1 но Release настройки с помощью Cfg_1 и Debug настройки с помощью Cfg_2.

при построении проекта, отладочная информация не будет создавать в конфигурации debug, но создать в конфигурации release.

открыто обходное решение .dproj с любым текстовым редактором, но не Delphi IDE, и обновление до:

<Import Project="Release.optset" Condition="'$(Cfg_1)'!='' And Exists('Release.optset')"/>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
    <CfgDependentOn>Release.optset</CfgDependentOn>
</PropertyGroup>
<Import Project="Debug.optset" Condition="'$(Cfg_2)'!='' And Exists('Debug.optset')"/>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
    <CfgDependentOn>Debug.optset</CfgDependentOn>
</PropertyGroup>

Я нашел в интернет .dprj файл одна строка в cfg_2 détails со значением Debugger_LoadAllSymbols, который был установлен в false. Я сделал это правдой. Проблема решена. Может быть, не похож на ваш случай, но может помочь.

<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
...
    <Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols>
...
</PropertyGroup>