首页 > 其他分享 >.NET高级调试 - 代码审查以及杂项命令

.NET高级调试 - 代码审查以及杂项命令

时间:2024-09-29 14:01:28浏览次数:4  
标签:汇编 代码 命令 描述符 反汇编 NET 杂项 调试

简介

代码审查就是观察代码,代码形态分为三种C#代码>IL代码》汇编代码。通过代码审查,可以从原始代码的字节流中推测出逻辑详情

高级调试本质上属于逆向分析,更多的是以汇编为主。

反汇编代码

u(unassemble)

命令u把字节流反汇编为汇编指令

还有一个变种ub,uf。 u是向下反汇编,ub是向上反汇编
uf是显示整个函数的返汇编代码

!U

由于sos拓展更清楚CLR的内部细节,因此!U的能够对程序集进行标注(给内存地址打上注释).从而使得反汇编指令更加可读
image
我们可以看到,同一段代码。!U命令反汇编的可读性更加高

获取方法描述符

有时候使用

!ip2md (instruction pointer to method descriptor)

image
除了方法的名字外,还额外显示了其他一些信息。方法描述符,方法表,JIT状态,代码地址等。要想快速找出汇编代码位于哪个函数中,会很方便

!name2ee

格式为 模块的名字和方法的全名
image
同样可以获取方法描述符

观察IL代码

!dumpil

sos提供了!dumpil 命令将托管函数的汇编反编译成IL代码,但不适用内存地址作为参数。而是以方法描述符为参数
image

观察C#代码

!savemodule

参数为module address.可以使用之前介绍的!ip2md或者!name2ee 来获取module地址
image
image

结论

dump文件不要轻易给别人分析,可以从任何角度反编译你的代码。
image

杂项命令

!eeversion 获取CLR版本

不仅能看到clr版本,还能看到sos版本以及CLR当前的运作模式(服务器模式还是工作站模式)

!gcroot 引用关系


这个命令非常实用,用来判断某一个对象的引用以及为什么没有被GC回收

!FinAppDomain 找出对象的应用程序域

!ProcInfo 转储进程信息

在调试过程中,有时候获得被调试的进程更多信息会非常有用。比如内存使用量,环境变量,处理时间等

标签:汇编,代码,命令,描述符,反汇编,NET,杂项,调试
From: https://www.cnblogs.com/lmy5215006/p/18438860

相关文章

  • YOLOv8改进 - 注意力篇 - 引入(A2-Nets)Double Attention Networks注意力机制
    一、本文介绍作为入门性篇章,这里介绍了A2-Nets网络注意力在YOLOv8中的使用。包含A2-Nets原理分析,A2-Nets的代码、A2-Nets的使用方法、以及添加以后的yaml文件及运行记录。二、A2-Nets原理分析A2-Nets官方论文地址:A2-Nets文章A2-Nets注意力机制(双重注意力机制):它从输入图......
  • skynet框架:批量服务管理方案
    skynet很经典的用法是节点内会有批量的服务跑相同的模块逻辑。服务的生命周期管理显然是跟业务强关联的,需要根据实际业务对应做适配的生命周期管理方案。显然最直接的方案就是服务常驻,跟进程的生命周期同步,当服务的数量级不大时,认为消耗可控,方案是适用的,也避免过度设计。这里想谈......
  • 杂项乱写 9.29
    因为没有模拟赛,所以考虑捡捡之前漏下的小点。注:LCA之后的讲解中可能会出现一些自由的文字,酌情阅读。dfs序求LCA倍增LCA的常数还是过于大了,虽然好记但会导致我们在一些数据奇异的题中比其它方式求LCA的人的得分要低。所以就有了这个用dfs序求lca的高科技,在时间效率......
  • .NET跨平台绘图基础库--SkiaSharp
    .NET跨平台绘图基础库--SkiaSharp SkiaSharp是一个跨平台的2D图形API,用于.NET平台,基于Google的Skia图形库。它提供了全面的2DAPI,可以在移动、服务器和桌面模型上渲染图像。SkiaSharp可以在多个.NET平台上使用,包括ASP.NETCore、WPF、Winform、MAUI、Avalonia......
  • .NET 开源高性能 MQTT 类库
    阅读目录前言项目介绍功能说明功能特点应用场景使用方法项目地址总结最后前言随着物联网(IoT)技术的迅猛发展,MQTT(消息队列遥测传输)协议凭借其轻量级和高效性,已成为众多物联网应用的首选通信标准。MQTTnet作为一个高性能的.NET开源库,为.NET平台上的MQTT客户端......
  • .Net 6 WebApi 项目部署到 Linux 系统上的 Docker 容器
    .Net6WebApi项目部署到Linux系统上的Docker容器 1.创建一个基础的WebApi项目  注意:因为发布时候,Dockerfile文件必须和解决方案.cspro文件放在同级,所以建议勾上这个,当时遇到这个问题,导致打包镜像时找不到.cspro文件,搞了好久  点击创建,项目基础框架是这样......
  • .Net 6 SignalR 实际业务开发中遇到的问题及解决办法
    .Net6SignalR实际业务开发中遇到的问题及解决办法 一、SiganlR使用的协议类型1.websocket即时通讯协议2.Server-SentEvents(SSE)服务器事件3.longpolling长轮询。如果客户端开启协商,会按顺序选择可兼容的协议。(默认开启协议协商)如果客户端禁用协商,只能websocket协......
  • .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票)
    .NET常见的几种项目架构模式,你知道几种?(附带使用情况投票) 思维导航前言三层架构MVC架构DDD分层架构整洁架构CQRS架构最后总结参考文章DotNetGuide技术社区前言项目架构模式在软件开发中扮演着至关重要的角色,它们为开发者提供了一套组织和管理代码的指导原则,以......
  • .Net Web项目中,实现轻量级本地事件总线 框架
    .NetWeb项目中,实现轻量级本地事件总线框架 一、事件总线设计方案1.1、事件总线的概念事件总线是一个事件管理器,负责统一处理系统中所有事件的发布和订阅。事件总线模式通过提供一种松耦合的方式来促进系统内部的业务模块之间的通信,从而增强系统的灵活性和可维护性。1......
  • ‌Java JVM相当于.NET Core的CLR。
    ‌JavaJVM相当于.NETCore的CLR。Java虚拟机(JVM)和.NET的公共语言运行时(CLR)在内部工作方面有相似之处,但也有一些区别。JVM的主要作用是将编译后的Java字节码转换为特定计算机上的可执行代码,允许跨平台的执行,并提供内存管理和垃圾回收功能。CLR作为.NET框架的核心组件,也是将.NET代......