clr

hez201014 天前
.net·.net core·clr·compiler
0. RyuJIT Tutorials - RyuJIT 的历史和架构RyuJIT - 即 .NET 的 JIT 编译器,负责将 IL 代码编译为最终用于执行的机器代码。本系列为 RyuJIT 教程,将分为多篇进行更新发布,旨在给对 .NET 编译器有兴趣、以及希望参与 .NET JIT 编译器开发工作的人提供一些参考资料。
离歌漠1 个月前
c++·c#·clr
C#调用C++ DLL方法之C++/CLI(托管C++)C++/CLI (C++/Common Language Infrastructure) 是一种用于编写托管代码的语言扩展,它是为了与 .NET Framework 进行互操作而设计的。C++/CLI 是 C++ 的一种方言,它引入了一些新的语法和关键字,以便更好地支持 .NET 类型和垃圾回收。
可均可可7 个月前
p/invoke·clr·com互用性·平台调用服务
Advanced .Net Debugging 9:平台互用性3.6、ExampleCore_7_043.7、ExampleCore_7_044(动态链接库,C++)
可均可可9 个月前
windbg·clr·程序集·ntsd
Advanced .Net Debugging 6:程序集加载器EntityUtil 类的代码Program 类的代码在 GAC 中的程序集必须是强命名的,并且拥有唯一的版本号。在共享程序集加载的过程中(在默认的加载上下文中),CLR 加载器会首先检查 GAC 来确定这个程序集是否存在,然后再查看私有的加载路径。             我们可以使用【Windbg Preview】工具,使用【lm f】命令查看目标进程中所有已加载的模块以及它们相应的加载路径。这个很简单,直接贴结果。这个里面,我使用【lm】和【lm f】两个命令,大家可以自己体会区别。
可均可可9 个月前
windbg·多线程·thread·clr·stack
Advanced .Net Debugging 5:基本调试任务(线程的操作、代码审查、CLR内部的命令、诊断命令和崩溃转储文件)打开【NTSD】调试器窗口。使用【g】命令运行调试器,知道调试器有如图输出,调试器会卡住暂停。按组合键【ctrl+c】进入中断模式,在所有操作之前,我们先切换到托管线程,执行命令【~0s】。
可均可可10 个月前
windbg·thread·gc·clr·ntsd·值类型·引用类型·托管堆
Advanced .Net Debugging 3:基本调试任务(对象检查:内存、值类型、引用类型、数组和异常的转储)打开【NTSD】调试器窗口。继续使用【g】命令,运行调试器,等调试器卡住后,按【ctrl+c】组合键键入调试器的中断模式。                     切换到主线程,执行命令【~0s】。
可均可可10 个月前
windbg·断点·clr·ntsd
Advanced .Net Debugging 3:基本调试任务(上)如果没有指定任何参数,只能显示一组可用的选项。我们将我们的项目完整路径和项目名称作为输入参数。执行【ntsd E:\Visual Studio 2022\Source\Projects\AdvancedDebug.NetFramework.Test\ExampleCore_3_1_1\bin\Debug\net8.0\ExampleCore_3_1_1.exe】,弹出新窗口,如图:
可均可可10 个月前
windbg·模块·sos·clr·appdomain·程序集·应用程序域·方法表·方法描述符
Advanced .Net Debugging 2:CLR基础2.2、ExampleCore_2_1_2在【DIRECTORY_ENTRY_COM_DESCRIPTOR】这个域下还有一个节点是【MetaData】,这个节点包含的是Net 程序包含的元数据结构信息,【DIRECTORY_ENTRY_COM_DESCRIPTOR】本身的【MetaData】字段包含了一个【.text】内容,在【.text】段中包含了程序集的元数据表,MSIL以及非托管启动存根代码。非托管启动存根代码包含了有 Windows 加载器执行以启动 PE 文件执行的代码。如图:
可均可可1 年前
windbg·sos·net 高级调试·clr
Advanced .Net Debugging 1:你必须知道的调试工具NTSD如图:我们安装了调试器工具集,也要配置环境变量,就不用每次使用都切换目录。64位 SOS 效果如图:
可均可可1 年前
windbg·p/invoke·sos·clr·com互用性
Net 高级调试之十六:平台互用性及P/Invoke和内存泄漏调试一、简介     今天是《Net 高级调试》的第十六篇文章,也是这个系列的最后一篇文章了。既然是最后一篇文章,我需要在这里说明一下,我当前的这个系列,不是针对《Net 高级调试》这本书来的,而是根据“一线码农”的视频做的这个系列。当然了,他的视频是根据《Net 高级调试》这本书来的,内容上做了一些调整,可以说是与时俱进的。说实在的,我第一次看《Net 高级调试》这个本书是蒙的,不知道从何处入手,有一个视频带我入门,相对而言是更容易下一下。入门之后,在深入研究《Net 高级调试这个本书》。好了废话就说这么多
可均可可1 年前
windbg·thread·sos·lock·clr
Net 高级调试之十五:经典的锁故障我们可以使用【!syncblk】命令查看一下是否我们程序有了什么问题。我们这里可以看到 3 号线程在持有 Person 对象,4 号线程在持有 Student 对象,然后我们分别依次切换到 3 号和 4号线程看看调用栈发生了什么情况,我们先看看 3 好线程。
可均可可1 年前
windbg·多线程·thread·sos·clr
Net 高级调试之十四:线程同步的基础知识和常见的同步原语程序运行起来如下:接着,我们在过【通过名称过滤(Filter by name)】中输入我们项目的名称:Example_14_1_1,来进程查找。效果如图:                          我们在找到的进程上双击破,打开新窗口,如图:                          我们找到了我们项目进程的主键线程编号,然后就可以使用 Windbg 查看内核态的线程表示了。我们主线程的编号是:1204,这个是十进制的,要注意。             然后,我们打开 Windbg,点击【
可均可可1 年前
windbg·perfview·clr·sos.dll
Net 高级调试之十三:托管堆的几个经典破坏问题第二部分,我还使用 Visual Studio 2022 创建了一个 C++ 项目,项目名:Example_13_1_1_2,Example_13_1_1_2.cpp 源码如下:
可均可可1 年前
sos·net 高级调试·clr·asp.net mvc
Net 高级调试之十二:垃圾回收机制以及终结器队列、对象固定Person1 类源码:Person2 类源码:Person3 类源码:Person 类源码:我们看到,红色标记的就是局部变量。我们看看它的内容,使用【!dumpobj /d 0x033c4e80 】。
可均可可1 年前
windbg·sos·net 高级调试·clr·sosex
Net 高级调试之十一:托管堆布局架构和对象分配机制输出的内容还是不少的,列表中【Heap 10 13b000 ( 1.230 MB) 1.00% 0.03%】,这个就是 NT 堆。             我们也可以使用【!heap -s】命令,查看 NT 堆的详情。
可均可可1 年前
windbg·sos·clr·ilemit
Net 高级调试之十:轻量级代码生成的调试上图是我们的代码,我们使用【!mbp】命令在18行下断点,【mbp】命令是 SOSEX的扩展命令,执行前必须加载 SOSEX.dll,我们需要使用【g】命令,继续运行程序,然后到达指定断点处停止后。
可均可可1 年前
windbg·debug·sos·clr·sosex
Net 高级调试之九:SOSEX 扩展命令介绍我们已经成功下了断点,但是英文提示 CLR 还没有被加载,我们使用【lm】命令查看一下加载模块信息,显示如下。
可均可可1 年前
windbg·sos·clr
Net 高级调试之八:代码审查及杂项命令代码很清楚,可以自行查看。当然我们也可以在Windbg的【Disassembly】窗口查看汇编代码,效果如图:
可均可可1 年前
windbg·sos·net 高级调试·clr
Net 高级调试之七:线程操作相关命令介绍一、简介     今天是《Net 高级调试》的第七篇文章。上一篇文章我们说了值类型,引用类型,数组等的内存表现形式。有了这个基础,我们可以更好的了解我们的程序在运行时的状态,内存里有什么东西,它们的结构组成是什么样子的,对我们调试程序是更有帮助的。今天,我们要说一些和线程有关的话题,虽然和线程相关,但是不是多线程的知识,不是线程安全的知识。今天我们讨论的是如何查看线程,它的表现形式,以及线程的调用栈,调用栈,又分为托管线程的调用栈和非托管线程的调用栈,这些也是我们高级调试必须掌握的。有了这些基础,我们就知
可均可可1 年前
windbg·sos·clr
Net 高级调试之六:对象检查之值类型、应用类型、数组和异常的转储031424c8(Person 对象的指针地址) 013d4dec(Person 方法表的地址)上面两段代码,红色标注的就是 Person 对象的方法表的地址,他们是一样的。我们有了对象的地址,对象的地址其实就是类型句柄的地址,也就是知道通过快索引的地址,只要减去 0x4就可以,说明一下,每个引用类型都包含【同步块索引】和【类型句柄】。