德尔福应用程序在调试时有"No Debug Info"



我们构建了一个使用包和组件的应用程序。 当我们调试应用程序时,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 个项目,都是用运行时包构建的:

  1. Core.bpl
  2. 组件.bpl
  3. Plugin.bpl(同时使用 #1 和 #2(
  4. 主应用.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,然后关闭ModulesCPU视图并按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_2Debug.optset绑定到Cfg_1Release配置正在使用Cfg_1Debug配置正在使用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>

相关内容

  • 没有找到相关文章

最新更新