我们构建了一个使用包和组件的应用程序。 当我们调试应用程序时,IDE 中的"事件日志"通常会显示我们的 BPL 正在加载而没有调试信息("无调试信息"(。 这没有意义,因为我们所有的包和 EXE 都是通过调试构建的。
_(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 个项目,都是用运行时包构建的:
- Core.bpl
- 组件.bpl
- Plugin.bpl(同时使用 #1 和 #2(
- 主应用.exe(使用 #1(
观察到的问题
1(很多时候,当我们调试时,Components.bpl加载了调试信息,但"局部变量"窗口中的所有值都是空白的。 如果将鼠标悬停在代码中的变量上,则不会弹出任何内容,并且"评估"窗口也不会显示任何内容("结果"窗格始终为空(。
2( 有时事件日志显示各种 BPL 的"无调试信息"。 例如,如果我们激活 Plugin.bpl 项目并将其设置为 Run |参数的主机应用程序是 MainApp.exe,然后按 F9,除 Plugin.bpl 模块外,所有模块似乎都加载了"具有调试信息"。 加载时,事件日志显示"无调试信息"。 但是,如果我们关闭应用程序并立即按 F9,它将再次运行它而不重新编译任何内容,这次 Plugin.bpl 加载了调试("具有调试信息"(。
问题
1( 什么会导致"局部变量"窗口不显示值?
2( 为什么当 BPL 符合调试并且所有调试文件(dcu、map 等(都可用时,有时会加载 BPL 而不加载调试信息?
我会描述我的问题。
我使用LoadPackage
函数动态加载包。
我可以在SysInternals.com Process Monitor
中看到该包名称。DCP 在处理LoadPackage
后打开并成功读取 - 没有文件 I/O 失败,没有尝试在错误的地方找到它,没有任何可疑之处。因此,也许DCP中有一些结构使IDE调试器发疯。我渴望Turbo Debugger
可以为德尔福服务的时候。
顺便说一句,包名也是如此。RSM 如果开发人员创建这样的。
然后(在断点或步骤跟踪处暂停时(我打开查看/调试窗口/模块,看到最后一个模块是我的 - 它有空的"符号信息"单元格。我右键单击它,选择"重新加载符号">操作 - 在这里,从现在开始我可以调试。
Dunno,如果这可以帮助我调试初始化部分 - 希望"break on load
"菜单项即使在动态LoadPackage
调用中也能正常工作......
.PPS。它确实有效,即使在 IDE 重新启动时也是如此。所以现在我在 BPL 加载时收到警报 CPU View
,我按CTRL+ALT+M
,滚动到底部找到我的 BPL,r-单击以Reload Symbols
,按 Enter,然后关闭Modules
并CPU
视图并按F9 (Run)
。initialization
部分完成后,我再次收到CPU View
的提醒 - 距离退出LoadPackage
只有几JMP
- 所以我关闭CPU View
并再次刺激F9
。相当乏味,但仍然比IDE重启更好。
我们在项目中遇到了类似的问题。不幸的是,我们有几十个 bpl,所以我们无法将它们合并为一个。此问题出现在我们迁移到 XE2 并更改编译目标的文件夹结构后。虽然很难说新版本的 Delphi 是否引入了这个问题,但我们可以通过在路径环境变量中添加编译 bpls 的文件夹来解决这个问题。使用 IDE 的路径覆盖功能。这种类型的配置在德尔福 2010 中不是必需的......
这个非官方工具修复了Delphi的许多问题。它修复了没有调试信息的模块加载问题。所有功劳都归功于魔术师1981。
您必须使用调试信息构建单独的包,并且最终希望在没有调试的情况下构建它们 - 因此您将在 2 个位置拥有两者。然后,你想要使用调试信息生成应用项目。检查路径以确保在调试项目生成中包含启用调试的包源。听起来您可能包含未经调试而构建的包,因为您包含的包来自错误的源。您必须确保没有包含两条路径,如果Delphi在两个地方找到相同的包,则让Delphi选择要包含的内容。
对于我们的特定情况,我们能够通过将 Core.pbl 和 Components.bpl 合并到一个 BPL 中来解决这个问题。 现在,所有模块都加载了调试信息,并且解决了局部变量窗口不显示变量值的偶尔问题。
这个问题可能与QC#109291有关:
当Delphi IDE开始引入.dproj文件并使用选项集构建配置时,它大大改善了项目发布管理。
但是,它也有难以重播和捕获的副作用,我认为这是 IDE 中的错误。 该问题应始终使用户感到困惑,因为某些项目无法在IDE调试器中进行调试。 即使我们检查了项目中编译器和链接选项的所有相关设置,调试器也不会在项目上激活。 有些项目有效,有些项目无效。 我们甚至认为是内存问题或CPU问题。
我注意到问题是由于.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
。
项目时,调试信息不会在调试配置中生成,而是在发布配置中生成。
解决方法是使用任何文本编辑器打开 .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尾巴中的一行,其值设置为 false Debugger_LoadAllSymbols。我确实将其设置为真。问题解决了。也许与您的情况不相似,但可能会有所帮助。
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
...
<Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols>
...
</PropertyGroup>