• 使用WinDBG调试查看C#内存转储文件


    有时候我们想查看一个正在运行的程序内存中的数据,可以在任务管理器将内存状态保存为转储文件,并使用WinDBG验证,这里我们来试试:

    0.安装WinDBG

    1.首先写个代码用来测试

    一个class

    public class MyClass
    {
    	public int AintValue = 123;
    	public static int BintValue = 456;
    	public string AstringValue = "AAA";
    	public static string BstringValue = "BBB";
    }
    

    在main中引用

    Console.WriteLine($"ret={d1(1)}");
    MyClass MC = new MyClass();
    MC.AstringValue = "SuperAAAA";
    Console.ReadKey(true);//程序会停在这,这时候保存文件
    Console.Write(MC.AstringValue);
    

    2.编译运行以后,到任务管理器保存内存转储文件

    3.用WinDBG打开转储文件

    点这里:

    这里,然后选文件:

    这里需要注意的是:
    32位的WinDBG用来调试32位的程序dump文件,
    64位的WInDBG用来调试64位的程序dump文件,
    如果你跟我一样用的是UWP版的WinDBG,那只能调试64位的(一定有办法能调32位的,但我不知道,如果你知道,请回复,感谢~)

    4:在内存中搜索我们要查看的对象类型


    我们可以看到中间有个命令输入框:

    首先输入两个命令,加载两个.net调试相关文件:

    .load C:WindowsMicrosoft.NETFramework64v4.0.30319SOS.dll
    .load C:WindowsMicrosoft.NETFramework64v4.0.30319clr.dll
    

    notice:中间有个目录是Framework64,如果是调试32位程序,改为Framework

    加载成功.
    在上面的C#代码中,我们声明了一个类 MyClass ,并实例化了它,现在我们要找到它,在windbg里,搜索类有两种方式:
    1:根据类名 (有可能重复)
    2:根据MT(Methot Table,唯一)
    刚开始是不知道MT的,所以根据类名搜索:

    !dumpheap -type MyClass
    

    notice:"!dumpheap -type"这部分不验证大小写,后面类名会验证大小写

    返回的内容,第一块是类的实例列表,第二块是对象列表(有时候名字很像的对象也会在这里)
    可以看到我们的对象只有一个,第一列是MT,如果你搜索出了多个,可以根据MT搜索:

    !DumpHeap -mt 00007ff9fc0a7488
    

    5:查看对象信息

    从实例列表中可以看到这个类只有1个实例,数据格式是:
    内存地址 MT 占用内存长度
    我们可以从内存地址,查看这个实例的详细信息:

    !DumpObj /d 000002331f11bed0
    

    notice:DumpObj 可以简写为do

    可以看到下面列出了对象的所有属性.包括静态的,动态的.

    值类型的属性直接显示了值
    引用类型的属性给出了引用地址

    对于string类型,我们还要再进一步:

    !DumpObj 000002331f112f18
    


    就可以看到字符串值了,如果是byte[]数据,可以直接用 "dd 内存起点 内存终点" 进行查看,如果想解析成字符串可以用du命令(u表示按unicode解析)

    dd 000002331f112f18+c 000002331f112f18+c+53
    du 000002331f112f18+c 000002331f112f18+c+8
    

    字符串数据前12个字节是字符串的属性,所以要过掉

  • 相关阅读:
    laravel 博客
    VSSより、指定したファイルを取得するマクロ(パス入り)
    使用SQLPlus连接Oracle实例
    SSH-Struts第四弹:Struts2学习过程中遇到的问题
    SSH-Struts第三弹:传智播客视频教程第一天上午的笔记
    Prim和Kruskal求最小生成树
    tarjan算法求强连通分量
    shutdown TCP 端口445
    Eclipse导出apk
    [模板]tarjan求强连通分量
  • 原文地址:https://www.cnblogs.com/DragonStart/p/7692102.html
Copyright © 2020-2023  润新知