2012-01-09 89 views
12

我们已经构建了一个使用包和组件的应用程序。当我们调试应用程序时,IDE中的“事件日志”通常会显示我们的BPL正在加载而没有调试信息(“无调试信息”)。这没有意义,因为我们所有的包和EXE都是用调试构建的。调试时Delphi应用程序有“无调试信息”

_(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)

个问题观察

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

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

问题

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

2)为什么在BPL符合调试和所有调试文件(dcu,map等)可用时,BPL有时会加载没有调试信息?

回答

2

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

+2

结合BPLs摆脱问题不是一个好的解决方案。想象一下,如果您拥有数百个动态包,则无法将其合并为一个BPL。 – 2012-10-05 02:02:43

+0

@ChauCheeYang - 我们有几十个其他BPL。造成这个问题的只是这两者的分离。在我们的例子中,将这两者结合是可以接受的,而将其他几十个分开......这可能与Components.bpl有很大关系,这很大程度上取决于Core.bpl。 – 2012-10-05 02:07:13

+0

您是否对'debug'和'release'配置使用optset reference? – 2012-10-05 08:29:15

2

您必须使用调试信息构建您的单独包,并且您最终还希望在不进行调试的情况下构建它们 - 因此您将在两个位置都拥有这两个包。然后你想用调试信息构建你的应用程序项目。检查您的路径以确保您在调试项目构建中包含启用了调试的软件包源。这听起来像你可能会包含没有调试的包,因为你包含错误的源代码。你必须确保你没有包含两条路径,如果Delphi在两个地方找到相同的包,则选择包含哪些内容。

+0

我们所有的项目都是使用debug进行编译的,并且DEBUG和RELEASE都使用相同的输出文件夹。因此,如果在没有DEBUG的情况下构建软件包,或者调试器正在查找任何软件包的RELEASE版本,则不会出现问题。我们将检查路径,以确保正确找到调试DCU。感谢您的建议。 – 2012-01-09 21:54:58

+0

+1您的建议检查路径。这导致我打开调试模块窗口,该窗口显示调试符号的加载位置。这有助于引导我解决问题的想法(请参阅下面的答案)。 – 2012-01-11 07:57:45

4

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

4

我会用它描述我的问题。

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

我可以在SysInternals.com Process Monitor看到packagename.DCP打开并在LoadPackage处理后成功读取 - 没有文件I/O失败,没有尝试在错误的地方找到它,没有任何可疑的东西。 所以也许在DCP中有一些构造使IDE调试器变得疯狂。我很喜欢当Turbo Debugger可用于德尔福

顺便说一句,同样是packagename.RSM就是这样创建的。

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

PS。不知道,如果这将帮助我调试初始化部分虽然 - 希望“break on load”菜单项将工作,即使动态LoadPackage调用...

PPS。它的确可以工作,即使在IDE重启时也是如此。所以现在我在BPL加载,i strike CTRL+ALT+M,滚动到底部找到我的BPL,点击到Reload Symbols,按回车,然后关闭ModulesCPU点击和点击F9 (Run)。在initialization部分完成后,我再次通过CPU View - 只有几个JMP s退出LoadPackage - 因此我再次关闭CPU ViewF9。非常乏味,但仍然比IDE重启更好。

+0

不回答*为什么*调试信息丢失,但为有用的解决方法+1。这比重启Delphi并反复尝试,直到它终于起作用要好得多。 – 2012-10-03 16:24:29

+0

它不会丢失,它存在于BPL中--CFF资源管理器显示这一点。 事实是,IDE不使用它 - 它使用DCP文件来代替。如果有几个DCP文件 - 那么它会失败。然而,为什么有时甚至在唯一的DCP出现时就会失败,并且它清楚地读取了该文件 - 这是神秘的。在我的情况下,我发现同名单位EXE:Path1 \ name和BPL1:Path2 \ name - 但是BPL1和BPL2已加载并且只有动态加载的BPL3受到影响。无论如何,SysInit单元将被克隆在所有EXE/DLL/BPL文件中,以免混淆IDE调试器。谜。 PS thx 2u注意模块视图 – 2012-10-03 16:34:00

+0

不客气 - 但我从来没有尝试右键单击以告诉它'重新加载符号'。这是一个不错的新技巧。 – 2012-10-03 16:42:08

2

这个问题可能是相关型号到QC#109291

当德尔福IDE开始引进.dproj文件,并建立与选项设置配置,完善项目管理发布的很多。

但是,它也有一个副作用,很难重播和捕捉,我认为这是IDE中的错误。这个问题应该总是让一些项目无法在IDE调试器中调试的用户感到困惑。即使我们检查项目中编译器和链接选项的所有相关设置,调试器也不会在项目上激活。一些项目工程和一些项目没有。我们甚至认为是内存问题或CPU问题。

我注意到问题是由于.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文件中有这样的事情。

构建项目时,调试信息不​​会在调试配置中生成,而会在发布配置中生成。

变通办法解决方案已打开。用任何文本编辑器,但不德尔福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> 
+0

这看起来很有希望,但我将无法测试它,直到再次遇到调试信息丢失的情况。感谢您分享您的经验。 – 2012-10-05 15:19:28

+0

是的。我通过删除dproj文件并让Delphi重新生成它来解决了许多问题。其中一个例子很多:http://stackoverflow.com/questions/21958575/access-violation-when-i-drop-a-tidsmtp-on-a-form – Ampere 2017-02-17 10:27:26

0

我在.dprj文件中Cfg_2一个符合其设置为false值Debugger_LoadAllSymbols细节发现。我确实将它设置为true。问题解决了。也许与您的情况不相似,但可能有所帮助。

<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> 
... 
    <Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols> 
... 
</PropertyGroup> 
4

This non-official tool修复了Delphi的许多问题。它修复了我没有调试信息的模块加载。所有学分到magicandre1981

+0

我在Delphi中调试设计包时遇到了麻烦XE6,IDE不想加载调试信息。这个工具帮助,谢谢! – 2015-11-19 19:13:28

+0

我每次遇到断点时也登陆'CPU'选项卡 - >我的bpl和app没有调试信息加载。我安装了这个工具,它工作。谢谢! – santiagoIT 2017-11-07 23:28:20