Delphi App有"无调试信息"调试时

时间:2012-01-09 19:01:13

标签: delphi debugging delphi-xe2 packages bpl

我们已经构建了一个使用包和组件的应用程序。当我们调试应用程序时,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. Core.bpl
  2. Components.bpl
  3. Plugin.bpl(同时使用#1和#2)
  4. MainApp.exe(使用#1)
  5. 观察到的问题

    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有时会在没有调试信息的情况下加载?

7 个答案:

答案 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

< BTW,同样适用于packagename.RSM是一个创建这样的。

然后(在断点或步骤跟踪暂停时)我打开查看/调试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_2Debug.optset绑定到Cfg_1Release配置正在使用Cfg_1Debug配置正在使用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>