c# - 调试混合的 Delphi( native )和 C# 代码,得到 "binary was built without debug information"

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

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

当我启动应用程序时,断点正确出现,但无法命中。

我目前的设置如下:

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

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

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

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

最佳答案

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

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

  1. 调试 -> 附加到进程...
  2. 选择正在运行的进程。
  3. 单击“附加到”右侧的“选择...”按钮。
  4. 选择“调试这些代码类型”
  5. 检查 Managed (v2.0, v1.1, v1.0) for .NET 3.5 or less,或 Managed (v4.0) for .NET 4.0 or later。不确定为什么 v3.5 被排除在此处的命名之外。
  6. 单击“确定”,单击“附加”。

在此之后,所有的断点都应该能很好地工作:)

关于c# - 调试混合的 Delphi( native )和 C# 代码,得到 "binary was built without debug information",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11204399/

相关文章:

c# - 比较坐标时无法从 int 转换为 System.Drawing.Point

c++ - Visual Studio 不会因断言违规而中断

rest - 如何在IIS 7上部署DataSnap/REST ISAP dll

c# - 如何以编程方式设置 ADO.Net DataTable 的 DataColumn 的 NullValue 属性

sql-server - 当 BCD 映射规则处于事件状态时,在 INSERT 查询中转换参数值会导致算术溢出

delphi - THttpClient 没有在 Delphi 中关闭连接

C# 将日期从 xml(格式可能因地区而异)转换为 DateTime 数据类型

c# - 如何打包和部署带有符号和源代码的 NuGet 包,以便调试器可以使用该源代码?

c# - 如何在服务器端关闭radwindow并刷新父页面

asp.net - IIS 7.0/Visual Studio 2010 - 页面的相关配置数据无效