调试托管程序中加载的本机dll

来源:互联网 发布:游戏视频制作软件 编辑:程序博客网 时间:2024/06/04 18:53

调试托管程序中加载的本机dll

背景

最近和c#的同事一起开发一个程序,我用c++开发sdk的dll,主程序使用c#开发。但是在调试过程中遇到了一些问题,vs附加c#程序后无法调试c++代码。

现象

在程序运行的过程中,sdk出现了一些问题,我需要调试c++代码。当我使用vs附加到运行的进程后发现c++dll的符号并没有被加载,断点无法生效。而且我确定pdb文件已经和dll文件放在一起,不可能是找不到pdb文件。

推测

我首先看了一下输出窗口的符号文件加载记录,发现一个奇怪的现象:常见的c++运行库dll和系统dll似乎都没加载符号,难道调试器只加载了托管dll的符号?我打开vs的菜单栏的调试/窗口/模块。打开模块窗口,看了一下所有加载的dll列表,发现确实只有托管dll,没有c++的dll。

c++的dll肯定是加载了,不然程序不可能运行,那么估计是因为vs认出了调试的是一个托管程序,所以只加载了托管dll的符号文件。

解决

显然调试c++程序和调试托管程序使用的调试器是不一样的。那么能不能手动指定使用的调试器类型而不让vs自动选择呢?
我在vs的官方文档中查到了相应的说明。
在vs中选择附加进程的对话框中进程列表上面有个按钮可以选择使用的调试器类型。

vs默认的调试器类型是自动选择,如果要调试的进程类型是托管进程那么vs就自动使用托管调试器,此时如果我想调试托管程序中的c++dll,应该选择本机调试。

我使用了本机调试器后开始调试,果然正常加载了c++dll的符号文件,断点也可以生效。

总结

这个问题我在网上搜索了好多博客但并没有找到解决方案,后来还是在官方文档中找到了说明,网上的博客中对于托管代码和本机代码互相调用的文章很少,以后遇到这种问题应该先看看官方文档。

0 0
原创粉丝点击