WinDbg配置与安装

卷儿哥 2023年11月23日 260次浏览

1、Windbg概述

教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了

  • WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
  • WinDbg是微软很重要的诊断调试工具: 可以查看源代码、设置断点、查看变量, 查看调用堆栈及内存情况。
  • Dump文件是进程的内存镜像, 可以把程序的执行状态通过调试器保存到dump文件中
  • 可以用来解决内存高,CPU高,程序异常,程序Hang死等常见的问题
  • 使用windbg进行调试分析的两种方式
    使用windbg调试器attach到需要调试的进程。(会暂停进程的运行)
    抓取进程的dump文件,使用windbg分析dump

2、下载安装

https://developer.microsoft.com/en-us/windows/downloads/windows-sdk/

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk

3、配置微软公有符号

Windows 调试中的符号表

符号表,对于vs用户来说,符号表就是vs生成的.pdb文件,比如你写了个helloword,一般会生成一个helloword.exe是执行程序,helloword.pdb就是符号表。
这些符号表,程序运行过程中没啥用,但是调试的时候有用,这里面主要记录了下面这些东西。

  • 全局变量
  • 局部变量
  • 函数名以及他们实体指针的地址
  • 帧指针表
  • 源代码行数

调试时,必须知道调试器能够获取与调试目标相匹配的symbol files,在线调试和调试crash dump files都需要symbols。Windows以后缀名pdb保存symbols,vs将所有symbols保存在pdb文件中。符号其实就是pdb文件,我们在debug模式下编译项目都会看到这个,它的作用会对dll进行打标,这样在调试时通过pdb就能看到局部变量,全局变量,行号等等其他信息,在FCL类库中的pdb文件就放在微软的公有服务器上,

SRV*C:\mysymbols*http://msdl.microsoft.com/download/symbols

4、sos.dll和clr.dll

为了将dump文件逆向到clr上的运行时状态,你必须要寻找到当时运行程序clr版本,同时也要找到对应clr版本的sos.dll,他们通常是在一起的,sos 就是 你 和 clr交互的渠道

  • windows 上的 netframework 配置

一般情况,使用windbg自带的命令【.loadby sos clr】即可自动加载,使用【.chain】查看加载是否成功。

64位程序加载路径

 .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
 .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll

32位程序加载路径

 .load C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll
 .load C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
  • windows上的 netcore 3.1 配置

在netcore中,clr的名字变成了 coreclr.dll,路径:C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.3

netcore3.0开始,sos就没有放在版本号文件下了,详见 SOS_README.md 内容,老版本的windbg,需要通过小工具dotnet-sos 自己生成一个sos.dll

dotnet tool install -g dotnet-sos

sos.dll 已经生成好了,接下来在任务管理器中生成一个dump文件,然后使用 .load 命令把 coreclr 和 sos 加载进去即可

.load C:\.dotnet\sos\sos.dll
.load C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.3\coreclr.dll

4、Linux 上调试

  • 使用netcore内置的dotnet-dump 小工具
    不过这个工具虽好,但是不能调试非托管堆,而且命令也不是太多,当然够我们平时用了
dotnet build
dotnet data.dll
ps -ef | grep dotnet
dotnet tool install -g dotnet-dump
export PATH=$PATH:$HOME/.dotnet/tools
dotnet-dump collect --process-id 31555

可以看到dump文件已经好了 /cs2/core_20200508_223204

dotnet-dump analyze /cs2/core_20200508_223204

sudo yum install centos-release-SCL epel-release
sudo yum install cmake cmake3 gcc gcc-c++ gdb git libicu libunwind make python27 tar wget which zip
cd $HOME
git clone https://github.com/dotnet/diagnostics.git
$HOME/diagnostics/documentation/lldb/centos7/build-install-lldb.sh

lldb -v

dotnet tool install -g dotnet-sos
dotnet-sos install

sos 是安装在 /root/.dotnet/sos 目录下,同时也看到在lldb启动的时候会自动加载sos.dll
使用createdump 生成dump文件
每个dotnet版本下都有一个createdump程序,可以用它生成dump文件,具体配置文档可以参见:
https://github.com/dotnet/diagnostics/blob/master/documentation/debugging-coredump.md

https://github.com/dotnet/runtime/blob/master/docs/design/coreclr/botr/xplat-minidump-generation.md#configurationpolicy

ps -ef | grep dotnet
find / -name createdump
./createdump 31555  -f /lldb/test.dump
lldb --core /lldb/test.dump