齐齐哈尔市:教你设置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了

admin 3周前 (05-09) 科技 6 0

一:靠山

1. 讲故事

前几天民众号里有位兄弟看了几篇文章之后,也准备用windbg试试看,效果这一配就花了好几天,(づ╥﹏╥)づ,我想也有许多跃跃欲试的同伙在设置的时刻一定会遇到这样和那样的问题,以是我以为有需要整理一下,让人人少走弯路。

二:一些基础观点

1. 在哪下载

现在安装windbg越来越贫苦,还要安装Windows 10 SDK,许多人就栽在这里,实在人人可以直接在网上找一键打包的windbg 6.0版本即可,才30多M,调生产调内陆都很利便,顺带还可以练练SOS下令。

云盘:https://pan.baidu.com/s/1VqXVIGVHxAZVPNds1525Jg 提取码:mahg

外网:http://www.33lc.com/soft/96743.html

2. 版本问题

解压打开会有一个x64和x86文件夹,很显然,32位的程序用x86下的windbg调试,64位的程序用x64的windbg调试,如下图:

3. 其他的问题

我对照喜欢用64bit程序,以是这里使用64位的windbg。

<1> 设置微软公有符号

符号实在就是pdb文件,我们在debug模式下编译项目都市看到这个,它的作用会对dll举行打标,这样在调试时通过pdb就能看到局部变量,全局变量,行号等等其他信息,在FCL类库中的pdb文件就放在微软的公有服务器上,SRV*C:\mysymbols*http://msdl.microsoft.com/download/symbols

<2> 明了sos.dll和clr.dll

许多时刻人人都是事后调试,以是需要在生产上抓一个dump文件,为了将dump文件逆向到clr上的运行时状态,你必须要寻找到那时运行程序clr版本,同时也要找到对应clr版本的sos.dll,他们通常是在一起的,sos 就是 你 和 clr交互的渠道,许多人都卡在寻找准确版本的sos和clr版本上。。。若是不清楚,我可以画张图。

有了这个前置基础,接下来就可以在windows和centos上举行设置实践了。。。

三. windows上的 netcore 3.1 设置

为了演示,我先上一段简朴的代码:


        static void Main(string[] args)
        {
            var info = "hello world!";
            Console.WriteLine(info);
            Console.ReadLine();
        }

1. 寻找clr.dll

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

齐齐哈尔市:教你设置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了 第1张

2. 寻找sos.dll

netcore3.0最先,sos就没有放在版本号文件下了,详见 SOS_README.md 内容。

齐齐哈尔市:教你设置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了 第2张


SOS and other diagnostic tools now ship of band and work with any version of the .NET Core runtime.
SOS has moved to the diagnostics repo here: https://github.com/dotnet/diagnostics.git.
Instructions to install SOS: https://github.com/dotnet/diagnostics#installing-sos.

看了上面文档,也许意思就是说老版本的windbg,需要通过小工具dotnet-sos 自己天生一个sos.dll,那就根据文档来吧


PS C:\WINDOWS\system32> dotnet tool install -g dotnet-sos
You can invoke the tool using the following command: dotnet-sos
Tool 'dotnet-sos' (version '3.1.122203') was successfully installed.
PS C:\WINDOWS\system32> dotnet-sos install
Installing SOS to C:\Users\hxc\.dotnet\sos from C:\Users\hxc\.dotnet\tools\.store\dotnet-sos\3.1.122203\dotnet-sos\3.1.122203\tools\netcoreapp2.1\any\win-x64
Installing over existing installation...
Creating installation directory...
Copying files...
Execute '.load C:\Users\hxc\.dotnet\sos\sos.dll' to load SOS in your Windows debugger.
Cleaning up...
SOS install succeeded
PS C:\WINDOWS\system32>

仔细看输出,sos.dll 已经天生好了,接下来在义务管理器中天生一个dump文件,然后使用 .load 下令把 coreclr 和 sos 加载进去即可。

齐齐哈尔市:教你设置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了 第3张


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

齐齐哈尔市:教你设置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了 第4张

最后我们抓一下 info 变量在堆上的漫衍。

0:000> ~0s
ntdll!ZwReadFile+0x14:
00007ff8`3228aa64 c3              ret

0:000> !clrstack -l
OS Thread Id: 0x41d4 (0)

000000246097EA40 00007FFF89C50F97 Error: Fail to initialize CoreCLR 80131022
ConsoleApp5.Program.Main(System.String[])
    LOCALS:
        0x000000246097EA68 = 0x0000021d8141aba8

0:000> !do 0x0000021d8141aba8
Name:        System.String
MethodTable: 00007fff89cd1e18
EEClass:     00007fff89cc2128
Size:        46(0x2e) bytes
File:        C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.3\System.Private.CoreLib.dll
String:      hello world!
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007fff89c1b1e8  4000242        8         System.Int32  1 instance               12 _stringLength
00007fff89c18000  4000243        c          System.Char  1 instance               68 _firstChar
00007fff89cd1e18  4000244      110        System.String  0   static 0000021d81411360 Empty

好了,windows上的netcore调试就这么简朴,希望这些设置能节约您的时间。

四. windows 上的 netframework 设置

framework程序比netcore设置要利便的多,不需要自己去天生sos了,如下代码所示:


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

五. centos 上的 netcore 3.1 设置

首先要明了,对于linux内核windbg就失效了,那怎么调试呢? 有两种方式。

1. 使用netcore内置的dotnet-dump 小工具

这个工具的地方在于,sos和clr都不需要你设置,直接使用它天生dump,然后直接调试,利便至极,下面看看怎么安装,开两个terminal,如下代码:


terminal 1:

[root@10-25-198-96 data]# dotnet build
[root@10-25-198-96 netcoreapp3.1]# dotnet data.dll
hello world


terminal 2:

[root@10-25-198-96 cs2]# ps -ef | grep dotnet
root     31555 31247  0 22:28 pts/0    00:00:00 dotnet cs2.dll
root     32112 31995  0 22:29 pts/2    00:00:00 grep --color=auto dotnet

[root@10-25-198-96 cs2]# dotnet tool install -g dotnet-dump
You can invoke the tool using the following command: dotnet-dump
Tool 'dotnet-dump' (version '3.1.122203') was successfully installed.
[root@10-25-198-96 cs2]# export PATH=$PATH:$HOME/.dotnet/tools
[root@10-25-198-96 cs2]# dotnet-dump collect --process-id 31555
Writing full to /cs2/core_20200508_223204
Complete

可以看到dump文件已经好了 /cs2/core_20200508_223204 ,接下来用 dotnet-dump 对dump文件调试。


[root@10-25-198-96 cs2]# dotnet-dump analyze /cs2/core_20200508_223204
Loading core dump: /cs2/core_20200508_223204 ...
Ready to process analysis commands. Type 'help' to list available commands or 'help [command]' to get detailed help on a command.
Type 'quit' or 'exit' to exit the session.
> clrstack -l                                                                                              
OS Thread Id: 0x7b43 (0)
        Child SP               IP Call Site
00007FFDFCABF2D0 00007fb0397af7fd [InlinedCallFrame: 00007ffdfcabf2d0] Interop+Sys.ReadStdin(Byte*, Int32)
00007FFDFCABF2D0 00007fafbebbb4db [InlinedCallFrame: 00007ffdfcabf2d0] Interop+Sys.ReadStdin(Byte*, Int32)
00007FFDFCABF2C0 00007FAFBEBBB4DB ILStubClass.IL_STUB_PInvoke(Byte*, Int32)

00007FFDFCABF9D0 00007FAFBECF844D System.Console.ReadLine()

00007FFDFCABF9E0 00007FAFBEBB037D cs2.Program.Main(System.String[]) [/cs2/Program.cs @ 13]
    LOCALS:
        0x00007FFDFCABF9F0 = 0x00007faf980081d8

00007FFDFCABFD08 00007fb037fc0f7f [GCFrame: 00007ffdfcabfd08] 
00007FFDFCAC01F0 00007fb037fc0f7f [GCFrame: 00007ffdfcac01f0] 
> dumpobj 0x00007faf980081d8                                                                               
Name:        System.String
MethodTable: 00007fafbec30f90
EEClass:     00007fafbeb9e1b0
Size:        44(0x2c) bytes
File:        /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.3/System.Private.CoreLib.dll
String:      hello world
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007fafbec2a0e8  400022a        8         System.Int32  1 instance               11 _stringLength
00007fafbec26f00  400022b        c          System.Char  1 instance               68 _firstChar
00007fafbec30f90  400022c      108        System.String  0   static 00007faf97fff360 Empty
>    

就这么简朴,不外这个工具虽好,然则不能调试非托管堆,而且下令也不是太多,固然够我们平时用了。

2. 使用linux专属的lldb调试器

要想实现windbg级别的调试,可以使用lldb调试器,这个异常壮大,这里我也来先容一下吧。

<1> 安装lldb

lldb是使用C++写的,也可以在 https://github.com/dotnet/diagnostics/blob/master/documentation/building/linux-instructions.md 寻找安装设施。


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

一阵抽搐后就安装好了,从下面可以看到现在版本是3.9.1。


[root@10-25-198-96 cs2]# lldb -v
lldb version 3.9.1 ( revision )

<2> 寻找sos.dll

跟windbg一样,你需要天生一个sos.dll 。。。 同样也是使用 dotnet-sos 天生。


[root@10-25-198-96 cs2]# dotnet tool install -g dotnet-sos
You can invoke the tool using the following command: dotnet-sos
Tool 'dotnet-sos' (version '3.1.122203') was successfully installed.
[root@10-25-198-96 cs2]# dotnet-sos install
Installing SOS to /root/.dotnet/sos from /root/.dotnet/tools/.store/dotnet-sos/3.1.122203/dotnet-sos/3.1.122203/tools/netcoreapp2.1/any/linux-x64
Installing over existing installation...
Creating installation directory...
Copying files...
Updating existing /root/.lldbinit file - LLDB will load SOS automatically at startup
Cleaning up...
SOS install succeeded

从上面信息看,sos 是安装在 /root/.dotnet/sos 目录下,同时也看到在lldb启动的时刻会自动加载sos.dll 。。。

<3> 使用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

[root@10-25-198-96 cs2]# ps -ef | grep dotnet
root     31555 31247  0 22:28 pts/0    00:00:00 dotnet cs2.dll
root     32112 31995  0 22:29 pts/2    00:00:00 grep --color=auto dotnet

[root@10-25-198-96 cs2]# find / -name createdump
/usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.3/createdump

[root@10-25-198-96 3.1.3]# ./createdump 31555  -f /lldb/test.dump
Writing minidump with heap to file /lldb/test.dump
Written 84692992 bytes (20677 pages) to core file

[root@10-25-198-96 3.1.3]# lldb --core /lldb/test.dump
(lldb) target create --core "/lldb/test.dump"
Core file '/lldb/test.dump' (x86_64) was loaded.
(lldb) clrstack -l
OS Thread Id: 0x7b43 (1)
00007FFDFCABF9E0 00007FAFBEBB037D cs2.Program.Main(System.String[]) [/cs2/Program.cs @ 13]
    LOCALS:
        0x00007FFDFCABF9F0 = 0x00007faf980081d8

00007FFDFCABFD08 00007fb037fc0f7f [GCFrame: 00007ffdfcabfd08] 
00007FFDFCAC01F0 00007fb037fc0f7f [GCFrame: 00007ffdfcac01f0] 
(lldb) dumpobj 0x00007faf980081d8
Name:        System.String
MethodTable: 00007fafbec30f90
EEClass:     00007fafbeb9e1b0
Size:        44(0x2c) bytes
File:        /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.3/System.Private.CoreLib.dll
String:      hello world
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
00007fafbec2a0e8  400022a        8         System.Int32  1 instance               11 _stringLength
00007fafbec26f00  400022b        c          System.Char  1 instance               68 _firstChar
00007fafbec30f90  400022c      108        System.String  0   static 00007faf97fff360 Empty
(lldb) 

可以看到,通过lldb也可以直接打入clr内部啦。。。

六: 总结

我以为这篇文章一定能给许多同伙节约不少的时间,想起朱一旦的那句话:有钱人的快乐,就是这么朴实无华且死板, 哈哈~~~

如您有更多问题与我互动,扫描下方进来吧~

齐齐哈尔市:教你设置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了 第5张齐齐哈尔市:教你设置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了 第6张

,

Sunbet

Sunbet 和 www.eyaeya.com强强联合,打造一站式全民直营平台,用资本、技术、服务在同行中获胜。Sunbet和EYAEYA网提供数十种线上纸牌、zhenren、电子游戏,致力打造公平公开公正的信誉平台。

Allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:齐齐哈尔市:教你设置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:437
  • 页面总数:0
  • 分类总数:8
  • 标签总数:970
  • 评论总数:117
  • 浏览总数:3358