由于作者水平有限,如有写得不对的地方,请指正。
使用WinDbg的过程中,坑特别的多,对版本要求比较严格,如:
1 32位应用程序导出的Dump文件要用32位的WinDbg打开,想要没有那么多的问题,还得要求用32位的任务管理器导出Dump文件,32位的任务管理器的路径如下:C:\Windows\SysWOW64\taskmgr.exe
2 64位应用程序导出的Dump文件要用64位的WinDbg打开
3 没指定位数的程序(如AnyCPU)导出的文件要用64位的WinDbg打开
本文目的,就是查看导出的dump文件中堆栈中的方法参数值,这样方便后续分析问题
本文测试环境:
.net framework 3.5
vistual studio 2017
win10 64位操作系统
步骤如下:
1 新增C# .net framework 控制台程序,选择.net framework 3.5 ,项目名称为:WindbgDemo,并编写代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace WindbgDemo
{
class Program
{
private static string _csdnUrl = "https://www.csdn.net/";
public static string BaiDuUrl = "https://www.baidu.com/";
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem((a) => {
new DownLoadBp().DownLoadOperation(BaiDuUrl);
});
//堵塞主线程
string readRet=Console.ReadLine();
Console.WriteLine("主线程读取到的结果:" + readRet);
Console.ReadKey(true);
}
}
public class DownLoadBp
{
public void DownLoadOperation(string url)
{
Console.WriteLine("子线程:url地址:"+url);
string readRet = Console.ReadLine();
//堵塞子线程
Console.ReadKey(true);
Console.WriteLine("子线程读取到的结果:" + readRet);
}
}
}
2 获取dump文件,参考前面的博文
3 利用!threads查看线程
4 利用~~[4d24]s切换到4d24线程
5 利用!clrstack -p 获取到详细的堆栈及地址信息
可以看到方法WindbgDemo.DownLoadBp.DownLoadOperation中的参数名称为url,对应的值的地址为:0x0000000003222bd8
6 利用 !do 地址值 查看 地址0x0000000003222bd8对应的值,如:
!do 0000000003222bd8
可以看到字符串的值为:https://www.baidu.com/
刚好与前面C#程序中的代码对应上: