本地代码的调试

4
我有一个使用C#编写的服务,调用的是最初用VC6编写的C DLL。
DLL中有一个我试图检查的bug。
在尝试让调试工作成为噩梦之后,我最终将DLL添加到包含C#服务的VS2005解决方案中,并添加了必要的“_CRT_SECURE_NO_WARNINGS”。
服务的调试版本使用“installutil.exe”工具进行注册。
我可以在通过对“System.Diagnostics.Debugger.Break();”调用进入dll的行之前使调试器中断。
我在网上找到了一些关于步入调试非托管代码的指导,启用了“启用非托管代码调试”复选框,我还尝试打开“选项->调试->本机”中的“加载DLL导出”和“启用RPC调试”(即使它不是COM)。 我还将调试版本的dll和.pdb复制到与服务相同的bin目录中。
但是非托管代码没有被步入,这正是我真正需要的。
更新:我在DLL属性中找到了调试类型,并将其设置为“混合”,如几个站点的建议,但无济于事。
更新2:我的项目现在将调试dll和pdb发射到与调试服务相同的目录中。 仍然无法调试dll。
3个回答

2

尝试将未受管控的代码设置为启动项目。我知道这听起来没有意义,但我记得这对一个非常类似的项目有效。

由于DLL没有关联的可执行文件,当您尝试运行它时,会弹出要求选择应用程序的对话框。浏览到您的C#应用程序,然后您就可以开始调试了。

祝您调试愉快!

编辑:虽然已经有一段时间了,但我认为调试类型Mixed是正确的。


这是一个服务 - 你不能将服务作为应用程序运行。 - graham.reeds
哦,我一直在想这个问题。恐怕我对服务不是很了解。如果没有 DLL 问题,你如何调试服务? - Sam Post
此外,如果您无法通过其他方式使其工作,您可以编写一个非常简单的C#应用程序来调试DLL。 - Sam Post
1
我创建了一个简单的控制台应用程序来执行dll未能正确执行的操作(创建unc路径-而不是在c:的根目录中创建unc名称的文件夹)。简单的测试成功了,所以我猜测dll中还有其他交互。使用实际的dll是不可行的,因为它是一份稀疏注释的c代码,共17952行。 - graham.reeds
你在调用 DLL 之前,在服务上设置了断点。那么为什么不从控制台应用程序中调用 DLL 中的相同函数呢?你可以传递与服务完全相同的参数,希望能够找到 DLL 中的错误。 - Sam Post
我无法调用该函数,因为它需要进行十几个其他调用来设置所有所需的资源。在我完成这些操作之前,我实际上已经重写了服务。我创建了一个简单的控制台应用程序来执行UNC目录创建,它可以正常工作,因此必须是输入参数在DLL内部发生了某种交互。 - graham.reeds

0
最后,我创建了一个控制台应用,并重新创建了所有之前的调用,以确保一旦到达实际服务和实际参数,调用将像实际服务一样运作。
我记录了我的修复过程以及产生的代码,详见我的网站

0

在Visual Studio 2013中有一个解决方法。从cmd行运行应用程序。当命中System.Diagnostics.Debugger.Break();时,Visual Studio即时调试器窗口应该弹出。选择“手动选择调试引擎”,点击“是”,并确保选中了“本机”引擎。点击“确定”。现在,您应该能够像在VS内部运行代码一样步入本机代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接