Delphi 德尔福应用程序有;“无调试信息”;调试时

Delphi 德尔福应用程序有;“无调试信息”;调试时,delphi,debugging,delphi-xe2,packages,bpl,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

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

  • Core.bpl
  • 组件.bpl
  • Plugin.bpl(同时使用#1和#2)
  • MainApp.exe(使用#1)
  • 观察到的问题

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

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

    问题

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


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

    您必须使用调试信息构建单独的包,并且最终您将希望在不进行调试的情况下构建它们-因此,您将在两个点中同时使用这两个文件。然后,您希望使用调试信息构建应用程序项目。检查路径以确保在调试项目生成中包含启用调试的包源。听起来您可能包含了未经调试构建的包,因为您包含的源代码错误。您必须确保没有同时包含这两个路径,如果Delphi在两个位置找到相同的包,它将选择要包含的内容。

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

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

    我将用它来描述我的问题

    我使用
    LoadPackage
    函数动态加载包

    我可以在
    SysInternals.com进程监视器
    中看到,在
    LoadPackage
    处理后,packagename.DCP被打开并成功读取-没有文件I/O失败,没有试图在错误的位置找到它,没有可疑之处。所以,也许DCP中有某种构造使IDE调试器发疯。我渴望有几次
    Turbo调试器
    可用于Delphi

    顺便说一句,如果开发人员创建了packagename.RSM,那么packagename.RSM也是如此

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

    PS.不知道这是否有助于我调试初始化部分-希望“
    加载中断
    ”菜单项即使在动态
    加载包
    调用中也能工作


    PPS。它确实可以工作,甚至可以跨IDE重新启动。因此,现在我在加载BPL时会被
    CPU视图
    提醒,我点击
    CTRL+ALT+M
    ,滚动到底部找到我的BPL,右键单击
    重新加载符号
    ,按Enter,然后关闭
    模块
    CPU
    视图并点击
    F9(运行)
    。在
    初始化
    部分完成后,
    CPU视图
    -在退出
    加载包
    之前,只有几次
    JMP
    -再次提醒我关闭
    CPU视图
    ,并再次点击
    F9
    。非常乏味,但仍然比IDE重启要好。

    此问题可能与以下原因有关:

    当DelphiIDE开始引入.dproj文件并使用选项集构建配置时,它大大改进了项目发布管理

    然而,它也有一个很难重播和捕捉的副作用,我认为这是IDE中的bug。当某些项目无法在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>
    

    我在.dprj文件中找到了Cfg_2 détails中的一行,其值Debugger_LoadAllSymbols设置为false。我确实把它设定为真的。问题解决了。可能与你的情况不太相似,但可能会有所帮助

    <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
    ...
        <Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols>
    ...
    </PropertyGroup>
    
    
    ...
    真的
    ...
    
    这解决了Delphi的许多问题。它修复了没有调试信息的模块加载。我们所有的项目都是用debug构建的,debug和RELEASE都使用相同的输出文件夹。所以它不是职业选手
    <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
    ...
        <Debugger_LoadAllSymbols>true</Debugger_LoadAllSymbols>
    ...
    </PropertyGroup>