我们已经构建了一个使用包和组件的应用程序。当我们调试应用程序时,IDE中的“事件日志”通常会显示我们的BPL正在加载而没有调试信息(“无调试信息”)。这没有意义,因为我们所有的包和EXE都是使用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个项目,都是使用运行时pacakges构建的:
观察到的问题
1)我们多次调试时,Components.bpl都加载了调试信息,但“Local Variables”窗口中的所有值都是空白的。如果将鼠标悬停在代码中的变量上,则没有弹出窗口,“评估”窗口也不显示任何内容(“结果”窗格始终为空白。)
2)有时事件日志显示各种BPL的“无调试信息”。例如,如果我们激活Plugin.bpl项目并设置它的Run |将参数的主机应用程序作为MainApp.exe,然后按F9,除Plugin.bpl模块外,所有模块似乎都加载“Has Debug Info”。加载时,事件日志显示“无调试信息”。但是,如果我们关闭应用程序并立即按F9,它将再次运行它而不重新编译任何东西,这次Plugin.bpl加载了调试(“有调试信息”)。
问题
1)什么会导致“局部变量”窗口不显示值?
2)当BPL符合调试并且所有调试文件(dcu,map等)都可用时,为什么BPL有时会在没有调试信息的情况下加载?
答案 0 :(得分:4)
我们在项目中遇到过类似的问题。不幸的是我们有几十个bpl,所以我们不能将它们合并为一个。 我们迁移到XE2并更改了编译目标的文件夹结构后出现此问题。 虽然很难说Delphi的新版本是否引入了这个问题,但我们可以通过添加在路径环境变量中编译bpls的文件夹来解决问题。使用IDE的路径覆盖功能。在Delphi 2010中不需要这种配置......
答案 1 :(得分:4)
我会用它描述我的问题。
我使用LoadPackage
函数动态加载包。
我可以在SysInternals.com Process Monitor
中看到packagename.DCP已经打开并在LoadPackage
处理后成功读取 - 没有文件I / O失败,没有尝试在错误的地方找到它,没有任何可疑之处。 所以也许在DCP中有一些构造使得IDE调试器变得疯狂。我渴望Turbo Debugger
可用于Delphi 。
然后(在断点或步骤跟踪暂停时)我打开查看/调试Windows /模块并查看最后一个模块是我的 - 它有空的“符号信息”单元格。我右键单击它,选择“重新加载符号”操作 - 就在这里,从现在开始我可以调试。
PS。 Dunno,如果这可以帮助我调试初始化部分 - 希望“break on load
”菜单项即使动态LoadPackage
调用也可以...
PPS。它确实工作,即使在IDE重启时也是如此。所以现在我收到BPL加载CPU View
的警报,我点击CTRL+ALT+M
,滚动到底部找到我的BPL,点按到Reload Symbols
,按Enter键,然后关闭{{1} }和Modules
观看并点击CPU
。在F9 (Run)
部分完成后,initialization
再次提醒我 - 在退出CPU View
之前只有少数JMP
- 所以我关闭了LoadPackage
并激活了{{1} }} 再次。相当乏味,但仍然比IDE重启更好。
答案 2 :(得分:4)
这个non-official tool修复了Delphi的许多问题。它为我修复了模块加载而没有调试信息。所有积分都归magicandre1981。
答案 3 :(得分:2)
您必须使用调试信息构建单独的软件包,并且您最终还是希望在没有调试的情况下构建它们 - 因此您将同时拥有2个位置。然后,您希望使用调试信息构建您的应用程序项目。检查路径以确保在调试项目构建中包含启用调试的程序包源。听起来你可能包括没有调试而构建的软件包,因为你包含了错误的源代码。您必须确保不包含这两个路径,如果Delphi在两个地方找到相同的包,请选择要包含的内容。
答案 4 :(得分:2)
对于我们的特定情况,我们能够通过将Core.pbl和Components.bpl组合到单个BPL中来解决问题。现在所有模块都加载了调试信息,并且解决了Locals Window不显示变量值的偶然问题。
答案 5 :(得分:2)
此问题可能会转移到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
。
构建项目时,调试信息不会在调试配置中生成,而是在发布配置时生成。
解决方案解决方案是使用任何文本编辑器而不是Delphi IDE打开.dproj,并更新到:
<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>
答案 6 :(得分:0)
我在.dprj文件中找到了Cfg_2détails中的一行,其值为Debugger_LoadAllSymbols,设置为false。我确实把它设置为真。问题解决了。也许与您的情况不相似,但可能有所帮助。
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
...
<Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols>
...
</PropertyGroup>