【问题标题】:Debugging mixed Delphi (native) and C# code, getting "binary was built without debug information"调试混合的 Delphi (native) 和 C# 代码,得到“二进制文件是在没有调试信息的情况下构建的”
【发布时间】:2012-06-27 14:20:43
【问题描述】:

我有一个 C# DLL with native exports,它是从一些 Delphi 2009 代码中调用的。 Delphi 代码使用LoadLibraryGetProcAddress 来访问导出的函数。我想在运行时调试代码的托管部分,但我遇到了麻烦。

当我启动应用程序时,断点正确显示,但未能命中。

我目前的设置如下:

  • Visual Studio 2010 中的 C# DLL 项目
  • 项目的调试设置设置为“启动外部程序”,指向 Delphi 可执行文件。
  • 已启用的非托管代码调试已关闭。
  • 在调试选项中启用了 Just My Code(这似乎没有什么区别)

我尝试启用非托管代码调试,但这会导致错误提示“二进制文件是在没有调试信息的情况下构建的”。如果我继续,所有断点都会被禁用。

当我检查模块列表时,可执行文件显示没有调试符号。 Delphi 不生成 PDB(它不能,因为它是封闭规范的专有格式),而是生成一个 MAP 文件。我环顾四周寻找 MAP-to-PDB 转换器工具,但似乎只有一个工具可以与我需要的相反。

我对从 Visual Studio 调试 Delphi 代码并不是很感兴趣,因为我已经可以在 CodeGear Delphi IDE 中执行此操作,但是在这种情况下有没有办法在运行时调试托管代码?

【问题讨论】:

    标签: c# visual-studio delphi debugging debug-symbols


    【解决方案1】:

    好的,我找到了解决方案。问题不在于调试符号,而在于被调试的代码类型。如果您从项目启动设置启动应用程序,调试器将以混合模式启动,这需要本地符号可用才能捕获从本地代码调用的 C# 代码。

    我无法让 Visual Studio 接受tds2dbg 创建的 pdb 文件,因此我找到了解决方法。为了确保调试器在托管模式下启动,请附加到进程而不是启动它,如下所示:

    1. 调试 -> 附加到进程...
    2. 选择正在运行的进程。
    3. 点击“附加到”右侧的“选择...”按钮。
    4. 选择“调试这些代码类型”
    5. 检查 .NET 3.5 或更低版本的托管(v2.0、v1.1、v1.0)或 .NET 4.0 或更高版本的托管 (v4.0)。不知道为什么 v3.5 被排除在此处的命名之外。
    6. 点击确定,点击附加。

    在此之后,所有断点都应该可以正常工作:)

    【讨论】:

      【解决方案2】:

      有一个“tds2pdb”你可以尝试创建一个 .pdb 文件: http://code.google.com/p/map2dbg/downloads/detail?name=tds2pdb102.zip

      注意:它不是一个完整的 .pdb 文件(规格不可用),但至少它适用于堆栈跟踪。但是,并非所有符号(类、变量、参数)都被导出。但你总是可以尝试...

      【讨论】:

      • Delphi 编译器/链接器不生成 TDS 文件。
      • 呃,问题是关于调试托管代码的。此答案与问题无关。
      • @Polynomial:较新版本可以选择生成外部调试文件 (*.tds)。
      • @AndreasHausladen 我正在使用 CodeGear Delphi 2009。抱歉,我们没有升级选项。
      • 原来TD32调试信息嵌入到.exe文件中,但IDE不支持单独保存。我找到了一个提取它的工具,以及另一个将其转换为 .dbg 文件的工具,但 Visual Studio 拒绝将其识别为可执行文件的匹配项。
      猜你喜欢
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 2014-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多