利用SOS扩展库进入高阶.NET6程序的调试

有时候我们可能想深入到程序的运行核心,去观察下内存分配情况以及堆栈内保存的东东,那么作为编程新贵的底层框架.NET6,又为我们提供了什么可用的观测工具呢?

1.SOS 扩展是什么?

SOS扩展库是Windows 附带的调试扩展库,它允许开发人员在 WinDbg、CDB 或 NTSD 中调试托管代码,请记住,当您执行托管二进制文件时,运行时会生成特定于平台的本机代码,而SOS 扩展允许您以“托管方式”调试本机代码。

最最主要的是,SOS 调试扩展允许您查看有关在** .NET Core 运行时**运行的代码的信息,包括实时进程和转储文件。

2. SOS支持跨平台吗?

是的,sos已经有mac、liunx和windows上的各个版本,它们支持不同的内核核心,可以用到不同的平台上进行扩展调试。

3.如何开始使用SOS?

sos扩展必须附加到别的调试工具上,因此其并不能独立运行。

为了调试.net 6程序,我们分别在不同的平台使用不同的工具进行演示。

3.1 Linux平台上使用LLDB工具

第一步是安装调试器LLDB。LLDB 与 WinDbg 非常相似,也是 SOS 团队一直在使用的调试器,因此我采用它作为 Linux 的默认调试器。

您可以从以下链接安装 LLDB:

https://lldb.llvm.org/download.html

或者您也可以通过运行以下命令来安装它:

yum install lldb

在 Linux 机器上安装 lldb 后,打开终端 并通过在提示符下键入以下命令来启动调试器:

lldb

如果 lldb 已正确启动,您将获得如下所示的 lldb 提示。

3.2 Linux 平台安装sos

没有sos扩展的加持,你是无法调试.NET程序的,因此还需要安装sos扩展。目前dotnet提供了简易安装方式,我们只需要录入下列命令即可。

dotnet tool install --global dotnet-sos
dotnet-sos install

默认安装的sos是和你cpu架构一致的版本,如果你需要其他版本,可以指定参数进行安装。
参数有下列值可用。

  • Arm

  • Arm64

  • X86

  • X64

例如:

dotnet-sos install --architecture Arm

在Linux系统中安装完sos后,再次启动LLDB,会默认加载sos扩展的。

3.3 利用LLDB调试程序

先启动.net 程序,然后利用ps查找进程号。

ps -ef | grep dotnet

然后启动lldb

lldb

在lldb命令界面内键入附加进程命令:

process attach -p 31339

附加dotnet程序进程到分析空间。

Process 31339 stopped

Executable module set to “/tmp/dotnet/bin/Debug/net5.0/dotnet”.

Architecture set to: x86_64–linux-gnu.

一旦附加到 lldb后,就可以显示线程列表。

您可以运行使用bt命令来检索当前线程的调用堆栈,但是很难调试它,因为您无法以“托管方式”查看堆栈.

为了测试,让我们运行clrstack命令,现在我们可以更好地了解正在发生的事情。

d34ba574cf33d99fc110fcda81d3b90a.png

我们还可以运行其他 SOS 命令(如clrThreads) 来找出所有管理线程,为此我们输入:

sos clrThreads

e6ed2cea50789857151a9153b8eb4092.png

如果您想自己尝试其他 SOS 命令,它们会列在 . NET 框架文档

希望这对你有用!

3.4 Windows上调试的支持

还可以通过将 SOS 调试扩展加载到 WinDbg/dbg 调试程序中并在 Windows 调试程序中执行命令来使用此扩展。可对实时进程或转储使用 SOS 命令。

欢迎尝试Windbg 预览版【微软商店】,千年不变的界面终于焕然一新。

df654bea5a7e1c96da707ab8a32d664c.png
安装sos依然是这些命令:

dotnet tool install --global dotnet-sos 
dotnet-sos install

安装后,可以在windbg内加载它

. Load %userprofile%\.Dotnet\SOS\sos.dll

然后在任务管理器中找到这个进程,保存dump文件到临时目录,利用windbg打开,并加载sos.dll.

!clrstack -a

5d76fe31c63e48df51f3719e241c3571.png

当然你可以根据需要键入不同的调试命令进行跟踪分析。

!runaway
!threadpool
!continue
!syncblk

4. 小结

高阶调试是不是把你学fei了?恩,学这个跟下篇文章有些瓜葛,因此不得不先介绍下调试器的使用。

👓都看到这了,还在乎点个赞吗?

👓都点赞了,还在乎一个收藏吗?

👓都收藏了,还在乎一个评论吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java--用 * 打印出各种图形(新手请进)

------------------------------------ 代码: public class PrintTriangle { public static void main(String[] args) { System.out.println("左边正三角形"); printTopLeft(5); System.out.println("左边倒三角形&quo…

这种动作片还需要汽车特效?

1 奇奇怪怪的扣分点又增加了▼2 就是活好!(素材来源网络,侵删)▼3 不愧是律师!(素材来源网络,侵删)▼4 成都马拉松惊现美食街!(素材来源网络,侵…

c语言中把每个字母向前移1位,C语言:将字符串中的前导*号全部移到字符串的尾部。...

//规定输入的字符串中只包含字母和*号,fun函数:将字符串中的前导*号全部移到字符串的尾部。1 #include 2 void fun( char *a )3 {4 char b[81];5 char *c,*d;6 c a;7 int i 0;8 while (*c *)9 {10 c;11 }12 d c;13 while (*c ! \0)14 {15 b[i] *c;1…

Android之支付宝设计与开发

背景 在移动支付领域,支付宝支付占用巨大份额,根据艾瑞咨询公布的报告数据:2014Q3,支付宝斩获了82.6%的市场份额,在移动支付的霸主地位越来越稳固。财付通支付的发力点在微信支付和手Q支付,在移动支付…

秘境探索之一个.NET 对象从内存分配到内存回收

前方高能预警,新手慎入!不听劝阻者,轻则郁闷堆积,重则生死看淡,对编程失去了念想,对生活失去了幻想!好了,心理强大到NB的可以忽略前方若干警示。为了探索.NET对象的内存分配和回收销…

iOS Newsstand Tutorial

http://stackoverflow.com/questions/8539310/ios-5-newsstand-application-icon http://www.viggiosoft.com/blog/blog/2011/10/17/ios-newsstand-tutorial/ http://blog.csdn.net/blueslf/article/details/8297482转载于:https://www.cnblogs.com/halou/p/3302809.html

这五部关于宇宙的神级纪录片,带你探索未知的外太空世界

宇宙之大无奇不有,在你的认知里你又知道多少关于宇宙的事情,如果单单用外星人概括你所对宇宙的认知就真的太片面了,小编今天就带来下面这四部关于宇宙的硬核纪录片,带你真正的去了解关于宇宙的知识,让你遨游在宇宙的知…

c#语言输出字符串长度,根据宽度来决定显示的字符串长度(C#)

根据宽度来决定显示的字符串长度 (C#,VS2005)如果 lable长度固定但字符串长度可变,如果超过了lable显示的长度时,希望用 ...代替剩下的字符,这时需要一个函数Graphics.MeasureString具体代码如下public string Abbreviation(string str){if (…

Android之版本检测和更新

版本检测和更新 APP不可能一次把功能全做完,当我们需要更新的时候,可以自己写,也可以用第三方更新,比如友盟更新,首先我们需要获取我们APP当前的版本,关键代码如下 private String getVersionCode() {try {String pkName = this.getPackageName();Strin…

Java 和 Android系统环境变量设置

Java环境变量设置 JAVA_HOMED:\Program Files\Java\jdk1.7.0_06 ClassPath.;D:\Program Files\Java\jdk1.7.0_06\lib\tools.jar.jar;D:\Program Files\Java\jdk1.7.0_06\jre\lib\rt.jar; PathD:\Program Files\Java\jdk1.7.0_06\bin Android环境变量设置 ANDROID_SDK_HOME默认路…

UITableView 禁止下拉

_tableView1.bounces NO;转载于:https://www.cnblogs.com/yangxiaolong/p/5278744.html

Exceptionless服务端+kibana部署实时日志纪要

安装软件列表Exceptionless.4.1.2861.zipelasticsearch-5.6.14.zipkibana-5.6.14-windows-x86.zip安装准备1. 在D盘下创建Exceptionless文件夹2. 拷贝需要安装的软件(参照上面安装软件列表)到Exceptionless文件夹下3. 安装JDK 1.8 (C环境中已经有安装, 步骤忽略)4. …

一些顿悟,和新的开始!

在大学末尾的这个下午,我意识到我应该好好经营一个技术博客。 一直想学学Python,但直到今天中午休息时,我才认真看着教程写了第一个Hello World。它的干净,清爽实在令人着迷,我一下午什么也没干一直看教程到旁边人提醒…

好心帮男朋友洗衣服,他却要分手??

1 每天一个分手小技巧(via.平民窟公主)▼2 导航最近的加油站(素材来源网络,侵删)▼3 单位停电发的蜡烛(via.蜻蜓队长)▼4 我也不知道原来有人这样穿啊!(素材来源网络&…

Android之如何解决右上角不显示3个点的菜单

之前写过小例子,发现菜单栏右上角的那3个点老是显示不出来,今天终于解决了,不废话,先爆照。 我之前的代码menu_main.xml 文件如下 <menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools&quo…

c语言实现容器,C语言三种容器:list vector和deque的区别

在写C程序的时候会发现STL是一个不错的东西&#xff0c;减少了代码量&#xff0c;使代码的复用率大大提高&#xff0c;减轻了程序猿的负担。还有一个就是容器&#xff0c;你会发现要是自己写一个链表、队列&#xff0c;或者是数组的时候&#xff0c;既要花时间还要操心怎么去维…

第二十一章流 5 多种打开文件的方式 文件存在,文件不存在

// 第二十一章流 5 多种打开文件的方式 文件存在&#xff0c;文件不存在 /* ios::in 打开文件进行读操作&#xff0c;即读取文件中的数据 ios::out 打开文件进行写操作&#xff0c;即输出数据到文件中 ios::ate 打开文件时针指向文件末尾&#xff0c;但是你可以在文件中的任何地…

如何高效的比较两个 Object 对象是否相等?

咨询区 DmitryBoyko&#xff1a;我有两个复杂的对象 Object1 和 Object2&#xff0c;这两个对象大概有 5 层的深度。我现在需要一个快速的方法比较两个对象是否相等&#xff0c;请问我该如何实现&#xff1f;回答区 vivek nuna&#xff1a;如果你的class是一个不可变的&#xf…

大型网站架构系列:电商网站架构案例

为什么80%的码农都做不了架构师&#xff1f;>>> #0 系列目录# 大型分布式网站架构大型分布式网站架构技术总结大型网站架构系列&#xff1a;电商网站架构案例#1 电商案例原因# 分布式大型网站&#xff0c;目前看主要有几类1.大型门户&#xff0c;比如网易&#xff…