有时候我们可能想深入到程序的运行核心,去观察下内存分配情况以及堆栈内保存的东东,那么作为编程新贵的底层框架.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命令,现在我们可以更好地了解正在发生的事情。

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

sos clrThreads

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

希望这对你有用!

3.4 Windows上调试的支持

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

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


安装sos依然是这些命令:

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

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

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

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

!clrstack -a

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

!runaway
!threadpool
!continue
!syncblk

4. 小结

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

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

  1. 高等数学期末总复习 DAY4. 利用莱布尼茨定理求高阶导 隐函数求导 对数求导法 参数函数求导 用导数求切线、法线 函数的微分

    DAY 4. 这世上总要有个明白人,懂得克制. 文章目录 DAY 4. 1. 利用莱布尼茨定理求高阶导 2.隐函数求导 3.对数求导 4.参数函数求导 5.用导数求切线.法线 6.函数的微分 1. 利 ...

  2. 二元函数对xy同时求导_高等数学期末总复习 DAY4. 利用莱布尼茨定理求高阶导 隐函数求导 对数求导法 参数函数求导等...

    DAY 4. 这世上总要有个明白人,懂得克制. DAY 4. 1. 利用莱布尼茨定理求高阶导 2.隐函数求导 3.对数求导 4.参数函数求导 5.用导数求切线.法线 6.函数的微分 1. 利用莱布尼茨 ...

  3. 重根的二阶迭代法matlab,计算方程重根的一个高阶迭代程序

    亏l我们知道,用通常的迭代程序(例如Newton一RaPhson程序)去求方程的重根,或者由于程序收敛甚慢而浪费机器的宝贵时间,或者导致程序发散.对代数方程而言,重根使方程具有"病态&quo ...

  4. php扩展库加密如何解密,如何利用Mcrypt扩展库进行加密和解密_PHP教程

    综述:Mcrypt 2.4.7是一个功能强大的加密算法扩展库,它包括有22种算法,其中就包括下面的几种算法: 以下为引用的内容: Blowfish RC2 Safer-sk64 xtea Cast-2 ...

  5. php利用mysql扩展库向数据库插入数据的步骤与案例

    1:程序代码 <?php //演示对user1表进行增删改查的操作 $conn = mysql_connect("localhost", "root",  ...

  6. 利用滞后——超前系统解决高阶随动系统(课程设计)

    一.题目 二.matlab数字仿真 clear; close all; clc %% 基本参数定义 gamma=45; %给定的相位裕度 data1=5; %补偿修正量 data2=5; %补偿修正量 ...

  7. php扩展库后门,编写基于PHP扩展库的后门

    author:lxj616 0x00 前言 今天我们将讨论编写基于PHP扩展库的后门.通常来说,大部分入侵者都会在脚本中留下自定义代码块后门.当然,这些东西很容易通过源代码的静态或动态分析找到. 利用 ...

  8. 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第39讲:PHP数据库编程MySQLi扩展库

    陈力:传智播客古代 珍宝币 泡泡龙游戏开发第39讲:PHP数据库编程MySQLi扩展库 mysqli扩展允许我们访问MySQL 数据库,并对MySql数据库进行curd操作.mysqli扩展可以进行数 ...

  9. Kotlin 特性 语法糖 优势 扩展 高阶 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

最新文章

  1. Linux主机驱动与外设驱动分离思想
  2. 【树莓派】首发树莓派4原型机接口参数曝光
  3. 数据中心新认证出现,UPTIME面临挑战
  4. 在数据库中outlet、code、outline为联合组件。hibarnate插入可如此插入
  5. 直连串口线、交叉串口线
  6. vue base64图片不显示_技巧 | word中插入的图片显示不完整怎么办?
  7. python语义分析_Python差异的潜在语义分析
  8. c++ windows下declspec
  9. IPV6之DHCPV6
  10. MySQL免安装版本的下载/配置/连接DBeaver---详细教程
  11. 那些年,我们一起追过的球队
  12. 学习系列之天眼查爬虫
  13. 谷歌浏览器注入的样式表 (更改了我网页的样式)
  14. ARCGIS水文分析:水库容量和蓄水区计算
  15. 课堂笔记 - 数据库设计
  16. @EnableScheduling和@Scheduled的使用
  17. 联通物联卡为什么没有网络_联通物联卡突然没有信号,试着用这几方法!
  18. SEO和UEO双结合才是网站优化的最高境界
  19. UE4入门(从Unity3D转学UE4)
  20. [云盘]协议包和数据库表设计

热门文章

  1. LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序
  2. mysql忘记密码,怎么办?
  3. MindFusion Pack for ASP.NET发布v2013.R2
  4. 剖析IE浏览器子系统的性能权重
  5. 使用window.postMessage实现跨域通信
  6. bzoj2721 [Violet 5]樱花
  7. Ubuntu16.04 + caffe-ssd + [CPU_ONLY] + KITTI 训练总结
  8. DEV-aspxgridview中的aspcheckbox
  9. ajax跨域请求的问题
  10. [轉]数据挖掘工具的选择