Windbg调试托管代码
- Windbg调试.net托管代码需要借助于SOS.dll,.Net 4.0的32位sos.dll的路径在C:\Windows\Microsoft.NET\Framework\v4.0.30319,64为的路径在C:\Windows\Microsoft.NET\Framework64\v4.0.30319,加载哪个版本的sos.dll要与调试的应用程序的位数一致。关于SOS调试扩展的详细介绍请参考:https://msdn.microsoft.com/zh-cn/library/bb190764(v=vs.100).aspx
- Windbg的可以通过Open Executable直接在windbg中启动程序调试,也可以通过Attach to a process attach到一个已经启动的进程进行调试,本例使用Open Executable方式调试程序
- 示例代码
static void Main(string[] args)
{
System.IO.FileSystemInfo fileSystemPath = GetFileSystemPath();
if (!fileSystemPath.Exists)
{
throw new System.IO.FileNotFoundException(fileSystemPath.FullName);
} Console.ReadLine();
}
private static FileSystemInfo GetFileSystemPath()
{
FileInfo fileInfo = new FileInfo(@"x:\Dev\TempLibrary.mdb"); return fileInfo;
} - 在Windbg中选择Open Executable打开应用程序,
- 如何在某个函数中设置断点:
- Open Executable的调试方法首先要执行sxe ld:clrjit命令,该命令的作用是表示当程序加载完clrjit.dll后中断到调试器,即在调试器中中断运行
- 执行g命令,运行程序,当程序加载完clrjit.dll时就会中断
- 执行.loadby sos clr命令加载扩展信息
- 执行lm命令查看加载的所有模块,lmvm可以查看某个模块的详细信息,本例中执行lmvm Console1
- 执行!Name2EE <模块名> <类型名或方法名> 命令获取模块中指定类型或方法的MethodTable结构和EEClass结构,本例中获取Program类的信息
- 调用DumpMT –md <MethodTable地址>获取类中方法信息,本例中methodtable地址由name2ee命令获取
- 执行!bpmd <模块名> <方法名>设置断点,本例中执行!bpmd Console1 Console1.Program.GetFileSystemPath
- 执行命令g,运行到断点就会停止
- 如何查看变量信息:
- !clrstack -a命令显示托管函数的参数和局部变量信息
- !dumpheap –type 类型:显示堆中某类型变量的地址信息,然后使用!dumpobj address显示变量信息
- 如何分析内存泄露:
- 执行!dumpheap命令可以打印出当前所有类型所占内存空间的大小
Windbg调试托管代码的更多相关文章
- windbg调试托管代码 .Net clr
现在很多的程序都是多语言混合编程的,比如我司的产品,就是用C++/.net clr混合编制的.那么当我们调试这样的程序时,一定要注意,比如有时我们只看到c++的栈和名称,而.net clr的代码确看不 ...
- WinDbg 调试.net程序
WinDbg支持以下三种类型的命令: · 常规命令,用来调试进程 · 点命令,用来控制调试器 · 扩展命令,可以添加叫WinDbg的自定义命令,一般由扩展dl ...
- 使用Windows Debugger调试托管代码----引用自官方帮助文档
以下文字引用在Windbg的帮助文档.觉得对初次调试托管代码,非常有用,故粘贴至此. ========================================================= ...
- WinDBG 调试命令大全
转载收藏于:http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html #调试命令窗口 ++++++++++++++++++++++++ ...
- 调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令
调试SQLSERVER (三)使用Windbg调试SQLSERVER的一些命令 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (二)使用Windbg调试SQLSERVER ...
- 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置
调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置 调试SQLSERVER (一)生成dump文件的方法调试SQLSERVER (三)使用Windbg调试SQLSERVER ...
- 开源项目asmjit——调用自定义方法demo以及windbg调试
asmjit是一个开源项目,使用它可以将代码即时的编译成机器码,也就是所谓的jit技术. 初次接触这个项目,编写了一个demo,学习它的使用方法. 现将编写的demo以及调试jit生成的机器码的过程总 ...
- WinDbg调试.NET程序入门
俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...
- 用WinDbg调试Windows和驱动程序
由于本人能力有限,翻译不足之处敬请谅解,欢迎批评指正:sunylat@163.com MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/h ...
随机推荐
- 格式化日期字符串 FormatSettings使用
如果 你想要得到 YYYY-MM/DD 这样的字符串 你肯定说这太简单了 直接 ShowMessage(FormatDateTime('YYYY-MM/DD',now)); 运行结果 YYYY-MM ...
- 三种排序方法(c语言)
#include "stdio.h" void main() {void read_data(int a[],int n); void write_data(int a[],int ...
- ZBrush中标准几何体与Polymesh
通过对ZBrush的学习,相信您已经对这款软件有了一定的了解,文本我们主要学习ZBrush®的3D物体标准几何体的特性和使用方法.在ZBrush中只有Polymesh(多边形网格)物体才能使用雕刻笔刷 ...
- EntityFramework 二
特性 用来具体的设置数据库属性 [Table("表名")]//设置表名 public class User { [Key] //设置主键 [Column("列名&qu ...
- DRF lazy Serializer
class LazySerializer: def __init__(self, cls_name, **kwargs): self.cls_name = cls_name self.kwargs = ...
- docker images镜像无法删除
删除所有容器: docker rm $(docker ps -aq) 删除镜像: docker rmi $(docker images -q) 如果有镜像无法删除,有可能更改了名字,用docker r ...
- BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机+map维护Trie树)
题目大意:略 由于字符集大,要用map维护Trie树 并不能用AC自动机的Trie图优化,不然内存会炸 所以我用AC自动机暴跳fail水过的 显然根据喵星人建AC自动机是不行的,所以要根据问题建 然而 ...
- [JZOJ]100046【NOIP2017提高A组模拟7.14】收集卡片
Star 计划订购一本将要发行的周刊杂志,但他可不是为了读书,而是-- 集卡. 已知杂志将要发行 N 周(也就是 N 期),每期都会附赠一张卡片.Star 通 过种种途径,了解到 N 期杂志附赠的卡片 ...
- [转载] C 陷阱与缺陷( C traps and Pitfalls )
本文转自 https://www.xuebuyuan.com/1951579.html 自己找工作过程中复习过的书包括<C traps and Pitfalls>,<编程珠玑> ...
- Laravel核心解读--Contracts契约
Contracts Laravel 的契约是一组定义框架提供的核心服务的接口, 例如我们在介绍用户认证的章节中到的用户看守器契约IllumninateContractsAuthGuard 和用户提供器 ...