14

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

观察到的问题

1) 很多时候,当我们调试时,Components.bpl 加载了调试信息,但是“局部变量”窗口中的所有值都是空白的。如果您将鼠标悬停在代码中的变量上,则不会弹出窗口,并且“评估”窗口也不会显示任何内容(“结果”窗格始终为空白)。

2) 有时事件日志显示各种 BPL 的“无调试信息”。例如,如果我们激活 Plugin.bpl 项目并将其设置为 Run | 参数的 Host Application 为 MainApp.exe,然后按 F9,除了 Plugin.bpl 模块外,所有模块似乎都加载了“Has Debug Info”。加载时,事件日志显示“无调试信息”。但是,如果我们关闭应用程序并立即按 F9,它将再次运行它而不重新编译任何内容,这一次 Plugin.bpl 加载了调试(“有调试信息”)。

问题

1) 什么会导致“局部变量”窗口显示值?

2) 为什么当 BPL 符合 debug 并且所有调试文件(dcu、map 等)都可用时,有时会在没有调试信息的情况下加载 BPL?

4

7 回答 7

5

我会描述我的问题。

LoadPackage我使用函数动态加载包。

我可以看到SysInternals.com Process Monitorpackagename.DCP 在LoadPackage处理后打开并成功读取 - 没有文件 I/O 失败,没有尝试在错误的位置找到它,没有任何可疑之处。所以也许 DCP 中有一些结构让 IDE 调试器发疯。我渴望Turbo Debugger可以使用 Delphi的时间。

顺便说一句,如果开发人员创建了 packagename.RSM,同样如此。

然后(在断点或步骤跟踪处暂停时)我打开查看/调试窗口/模块并查看最后一个模块是我的 - 它有空的“符号信息”单元格。我右键单击它,选择“重新加载符号”操作 - 就在这里,从现在开始我可以调试了。

PS。不知道这是否可以帮助我调试初始化部分-希望“ break on load”菜单项即使在动态LoadPackage调用中也能正常工作...

聚苯乙烯。它确实有效,即使在 IDE 重新启动时也是如此。所以现在我在 BPL 加载时收到警报CPU View,我CTRL+ALT+M点击,滚动到底部以找到我的 BPL,r-click 到Reload Symbols,按 Enter,然后关闭ModulesCPU查看并点击F9 (Run)。部分完成后initialization,我再次收到警报CPU View-JMP在退出前几秒LoadPackage- 所以我再次关闭CPU ViewF9再次罢工。相当乏味,但仍然比 IDE 重启好。

于 2012-10-03T11:23:17.763 回答
4

我们在项目中遇到过类似的问题。不幸的是,我们有几十个 bpl,所以我们无法将它们合并为一个。这个问题是在我们迁移到 XE2 并更改了编译目标的文件夹结构后出现的。虽然很难说较新版本的 Delphi 是否引入了该问题,但我们可以通过在路径环境变量中添加编译 bpls 的文件夹来解决该问题。使用 IDE 的路径覆盖功能。Delphi 2010 中不需要这种类型的配置...

于 2012-08-13T01:34:35.973 回答
4

这个非官方工具修复了 Delphi 的许多问题。它为我修复了没有调试信息的模块加载。所有归功于 magicandre1981

于 2014-06-04T01:48:51.883 回答
2

对于我们的特殊情况,我们能够通过将 Core.pbl 和 Components.bpl 组合成一个 BPL 来解决这个问题。现在所有模块都加载了调试信息,局部窗口不显示变量值的偶尔问题得到解决。

于 2012-01-11T08:01:16.563 回答
2

您必须使用调试信息构建单独的包,并且您最终也希望在没有调试的情况下构建它们 - 所以您将在 2 个位置拥有两者。然后你想用调试信息构建你的应用程序项目。检查您的路径以确保您在调试项目构建中包含启用调试的包源。听起来您可能包含了在没有调试的情况下构建的包,因为您包含的源错误。您必须确保没有包含两个路径,让 Delphi 在两个地方找到相同的包时选择要包含的内容。

于 2012-01-09T19:44:08.300 回答
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.optsetbind to和bind to but configuration is usingCfg_2和configuration is using 。Debug.optsetCfg_1ReleaseCfg_1DebugCfg_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>
于 2012-10-05T09:37:48.223 回答
0

我在 .dprj 文件中发现 Cfg_2 详细信息中的一行,其值 Debugger_LoadAllSymbols 设置为 false。我确实将其设置为true。问题解决了。也许与您的情况不同,但可能会有所帮助。

<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
...
    <Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols>
...
</PropertyGroup>
于 2013-08-13T09:13:39.007 回答