调试混合的Delphi(本机)和C#代码,获得“二进制是在没有调试信息的情况下构建的”

时间:2012-06-26 09:30:49

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

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

当我启动应用程序时,断点正确显示,但无法被击中。

我目前的设置如下:

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

我已经尝试过启用非托管代码调试,但这会导致错误说"二进制是在没有调试信息的情况下构建的#34;。如果我继续,则禁用所有断点。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

  1. 调试 - >附加到流程......
  2. 选择正在运行的流程。
  3. 点击“附加到”右侧的“选择...”按钮。
  4. 选择“调试这些代码类型”
  5. 检查托管(v2.0,v1.1,v1.0)是否支持.NET 3.5或更低版本,或托管(v4.0)适用于.NET 4.0或更高版本。不确定为什么v3.5被排除在这里的命名之外。
  6. 单击“确定”,单击“附加”。
  7. 在此之后,所有断点应该可以正常工作:)

答案 1 :(得分:1)

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

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