调试托管程序中加载的本机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的符号文件,断点也可以生效。
总结
这个问题我在网上搜索了好多博客但并没有找到解决方案,后来还是在官方文档中找到了说明,网上的博客中对于托管代码和本机代码互相调用的文章很少,以后遇到这种问题应该先看看官方文档。
- 调试托管程序中加载的本机dll
- 如何在托管程序中动态加载dll并且调用其中的函数
- 使用 VS + SOS.dll 调试托管程序
- 使用 VS + SOS.dll 调试托管程序
- Windbg教程-调试非托管程序的基本命令中
- Windbg教程-调试非托管程序的基本命令中
- 微信小程序使用C#的WebService加载非托管dll配置iis
- ASP.net 不能加载一个托管dll使用的非托管dll
- C#中如何调用托管的DLL
- 使用SOS - 在Visual Studio中启用非托管代码调试来支持本机代码调试
- VS2005在本机WINCE模拟器中调试程序
- VC DLL程序的调试
- 混合(本机和托管)程序集
- 混合(本机和托管)程序集
- C#程序实现动态调用非托管的DLL文件
- C#程序调用非托管C++ DLL文件的方法
- C#程序实现动态调用非托管的DLL文件
- C#程序实现动态调用非托管的DLL文件
- Unity摄像机遮挡剔除(Occlusion Cullings)
- 关系数据库
- Redis客户端之Jedis(Key、String、Set、List、pub/sub、cluster、pool、pipleline)
- Java Property类文件配置
- HAUT校赛--某科学的打麻将
- 调试托管程序中加载的本机dll
- CSUOJ 1885 条条大路通罗马(最长路径)
- 5句经典
- SVN服务器搭建与使用二
- 线程池常用类学习笔记
- 函数调用栈理解
- pthread多线程同步大全
- scrapy 爬课程信息
- 重学java「二」