在Delphi 2009中编写的DLL不可见蓝点(编译行指示符)

时间:2015-02-17 11:07:50

标签: delphi delphi-2009

我在Delphi 2009中编写了一个DLL。当我编译它时,.dll文件是 已成功创建,但源(IDE)中未显示蓝点。什么时候 试图通过附加进程来调试它,断点被禁用。

1 个答案:

答案 0 :(得分:1)

检查this list

  • 首先,请务必按照here的说明(重新)设置调试选项。请务必启用调试信息,并确保代码中没有{$ D-}等指令。
  • 检查文件路径:
    • 请确保您在不同的文件夹(即新旧文件)中没有两个具有相同名称的不同单元。您可能在编辑器中加载了错误的单元,但调试器将在另一个单元上运行。
    • 确保单位的输出文件夹列为库搜索路径(按项目设置)。
    • 确保您的文件包含在项目中,并将使用项目进行编译:
    • 检查项目的搜索路径;
    • 检查.dpr / .dproj文件中的已使用文件(带有显式文件路径)(项目/视图源)。
  • 删除旧文件(* .dcu,* .obj,* .lib,* .tds,* .rsm,* .bpl,* .dcp,* .exe,* .dll)并构建您的项目(不只是制作/编译)。
  • 检查任何第三方后期编译工具。
  • 您可能打开了不属于项目的文件。文件可能已经编译过,或者可能不是项目的一部分(想想exe / DLL)。
  • 您的项目可能是DLL并且DLL没有被主机进程加载。在加载DLL之前,断点不起作用。有时DLL可能根本没有加载。
  • 您的项目中可能没有使用带断点的代码。例如,一个单元可以包含3个功能。函数#1和#2从程序中调用,但函数#3不是。因此,函数#3中的断点将不起作用。类似地,优化的编译器可以从函数中删除单独的代码行。例如,代码行计算值,但此值不会在任何地方使用。最终的可执行文件中将省略此类代码。
  • 您的代码可能放在运行时包(.bpl)中。因此,重建项目不会影响该单元。并且可以在没有调试信息的情况下编译该单元(在包中)。如果是这种情况 - 那么您需要使用调试信息重建包,或者删除在项目中使用的包。
  • 调试器无法将正在运行的程序与您的项目相关联。为了避免这种情况
    • 不要重命名应用程序和DLL。命名具有所需名称的项目文件。
    • 不要将应用程序和DLL移动到其他文件夹。设置正确的输出文件夹而不是移动文件。对于DLL和Win32服务尤其如此。
    • 不要通过其他名称运行应用程序(不要加载DLL)。例如,可以通过不同的名称(文件夹本身,硬链接,通过映射的网络共享,通过重新分析点,子驱动器)访问相同的文件夹。因此,如果您可以访问具有不同名称的相同文件/文件夹 - 请确保在所有位置使用完全相同的名称。对于DLL来说尤其如此,因为它们是由主机进程加载的(可能不受您控制)。您可以使用Process Monitor或类似工具来检查文件访问。
    • 确保所有文件路径仅包含ASCII符号(拉丁语)。不要使用代码大于128的本地符号。
    • 不要更改已编译文件和.dcu / .obj / .lib文件的日期/时间(创建或修改日期)。更改日期/时间可能会导致调试器考虑更改文件。 "变更"文件需要重新编译,因此它们彼此不匹配。有时日期/时间可以通过防病毒软件或后处理工具(如数字签名)进行更改。
    • 不要删除也不要移动.dcu / .obj / .lib文件。务必将单位输出文件夹设置到正确的位置。确保库搜索路径中列出了单位输出文件夹。尝试将.dcu / .obj / .lib文件放在与.exe / .dll / .bpl / .dcp文件相同的文件夹中。
    • 确保找到所有文件。通过"项目/添加到项目"明确指定搜索路径或包含单位命令。
    • 尝试启用TD32调试信息。
    • 作为极端情况 - 尝试输出单个文件夹中的所有文件。即在包含源文件的文件夹中输出.dcu / .obj / .lib / .exe / .dll / .bpl / .dcp文件。