- 博客(169)
- 资源 (9)
- 收藏
- 关注
原创 .NET8 AOT和JIT的性能,谁更高呢?
一:有人问:.NET8 AOT和JIT的性能,谁更高呢?原文:.NET8 AOT和JIT的性能,谁更高呢?其实这个答案非常明显,那就是JIT的性能更高。为什么?原因在哪?因为JIT是随时可能分层编译,动态PGO,CHRL,Non GC Heap,OSR。Quick等极致的优化措施(关于这些措施,可以参考公众号(jianghupt)之前的文章,有详细描述)。只要触发了这些优化的条件。但是A...
2023-12-13 09:42:00
497
原创 2023年最新.Net面试题,看看你会多少
跟身边业内朋友讨论如今的现状,对于技术,经验,能力缺乏的。不仅工作越来越难找,面试的机会也少了很多。对于一些刁钻的面试官,他们喜欢问各种稀奇古怪的问题。45.CLR的内存映射(EnableWriteXorExecute)的作用主要是什么。48.基础类型优化,循环克隆优化,矢量化优化分别是什么,如何优化的。28.分层编译,OSR,GDV,常量分别是如何做到极致优化的。31.GCInfo,EHinfo是如何运行和解码的。18.托管堆,堆段,区域,分配上下文,都是什么。.GC计划阶段的二叉树是如何构建的。
2023-11-04 13:16:12
355
原创 .Net8 AOT+VMP简单的逆向分析
1.前言测试下VMP加密.NET的强度,选了最新的.Net8+AOT编译,用VMP给它加壳。最后逆向下,简单的分析,本篇看下。2.概述一.前奏首先一段简单的C#代码:namespace Test_{ internal class Program{ static void Main(string[] args) { Console.Writ...
2023-09-10 15:19:00
1507
原创 .Net8顶级技术:边界检查之IR解析(二)
前言IR技术应用在各个编程语言当中,它属于JIT的核心部分,确实有点点麻烦。但部分基本明了。本篇通过.Net8里面的边界检查的小例子了解下。前情提要,看这一篇之前建议看看前一篇:点击此处,以便于理解。概括1.前奏先上C#代码:[MethodImpl(MethodImplOptions.NoInlining)]private static bool Test(int[] array)...
2023-05-24 08:11:00
481
原创 Java/.Net双平台核心,Jvm和CLR运行异同点
可以看到generate_call_stub和call_stub两者在create_vm函数处分为两处,首先调用了generate_call_stub对函数进行了编译,再调用call_stub对编译好的函数进行了调用。_call_stub_entry里面包含了需要运行函数的函数头地址,在call_stub里面进行地址跳转调用。JVM事先把需要运行的函数编译好存放在某个地址,此后通过呼叫桩(call_stub)进行调用,这里的某个地址里面包含了需要运行的函数头地址,在里面跳转运行。先看JVM,它的调用如下。
2023-03-03 13:15:16
455
原创 .Net 7 CLR和ILC编译函数过程
随着研究深入,发现CLR编译函数与ILC编译是两种不同的截然方式,除了JIT部分编译一样,其它部分貌似完全不一。本篇来梳理这些东西。wx公众号:江湖评谈。
2022-12-12 19:55:51
423
原创 .Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗
楔子有小伙伴被面试官问到这个问题,本篇彻底解析下这个问题。为了彻底点,注意本篇是最底层的.Net 7 RC CLR运行模型(汇编)为基础进行全局剖析,局部业务分析。如有疏漏,请斧正。目的非手段这两个函数比较特殊的存在,.Ctor是非静态默认实例化。.CCtor是静态默认实例化。这两个函数伴随着.Net 任何对象的实例化都自动存在于这个对象当中。跟踪.CCtor可以在全局静态对象下断点...
2022-11-08 10:08:00
868
原创 Substring 在BCL和CLR里面搞了啥
楔子还是做点事情,不要那么散漫。本文以简单的Substring(int startindex,int Length)函数为例,来递进下它在托管和非托管的一些行为。以下均为个人理解,如有疏漏请指正。定义和实现它的定义是在System.Runtime.dll里面public string Substring(int startIndex, int length){ throw n...
2022-11-07 12:23:00
328
原创 .Net CLR异常简析
楔子前面一篇研究了下C++异常的,这篇来看下,CLR的异常内存模型,实际上都是一个模型,承继自windows异常处理机制。不同的是,有VC编译器(vcruntime.dll)接管的部分,被CLR里面的函数ProcessCLRException接管了。注意:这里面省略了一部分不必要赘述的细节问题,版本号分别为(CLR PreView 7和vcruntime 14.0)C++异常栈vcrun...
2022-10-12 08:25:00
464
原创 windows C++ 异常调用栈简析
楔子以win11 + vs2022运行VC++ 编译观察的结果。如果安装了Visual Studio 2022,比如安装在D盘,则路径:D:\Visual Studio\IDE\VC\Tools\MSVC\14.33.31629下面包含了vcruntime.dll的源码,主要VC编译器和ntdll.dll 以及KernelBase.dll交互。注:本篇不叙述正常的windows用户态和...
2022-10-11 14:52:00
891
原创 GC plan_phase二叉树挂接的一个算法
楔子在看GC垃圾回收plan_phase的时候,发现了一段特殊的代码,仔细研究下得知,获取当前数字bit位里面为1的个数。通过这个bit位为1的个数(count),来确定挂接当前二叉树子节点的一个地方。算法size_t logcount (size_t word){ //counts the number of high bits in a 16 bit word. a...
2022-10-09 14:17:00
231
转载 4年前的最佳小说回顾
古代有一小姐,遇到一个上京赶考的穷书生避雨,发现其很有才华后,掏出一些银两,并以身相许,次日小姐垂泪送书生:“君若高中莫负妾身。”书生发誓后走了。小姐让丫环把书生的名字纪录在册,丫头说:“这已经是第五十个书生了!”小姐说:“没办法,总有一个会真的考上的。——2016最佳小说《风投》书生让书童把小姐的名字记下,感叹道:这是第一百个了啊。——2016最佳小说《融资》书生的伴读童子问书生:公子,自从三年前你离家,如今已经睡了九十余名女子了,我们在各大赴京路上往复,难道就不去赶考了吗?书生答:赶考当大官不也
2020-12-22 15:38:17
440
原创 C++ 桌面图标(转载)
#include<windows.h>#include<commctrl.h>#include <stdio.h>typedef struct tagLVITEM64A{ UINT mask; int iItem; int iSubItem; UINT state; UINT stateMask; INT64 pszText; int cchText...
2020-12-04 15:09:00
1885
原创 .Net 5的 Span结构内存分析
假如说有一下程序使用了Span:static void Main(string[] args){Span span = new byte[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };span = span.Slice(5, 2);GC.Collect();Console.WriteLine(span.Length);Console.ReadLine();}分析如下:span数组在内存的存储布局断点到此处,并打印出 rbp 寄存器内容span结构体的地
2020-11-15 12:25:21
577
原创 windbg调试入门(转载)
好不容易把环境打好了,一定要试试牛刀。我创建了一个极其简单的程序(如下)。让我们期待会有好的结果吧,阿门! using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ class Progra...
2020-11-07 11:04:00
301
原创 Ubuntu 安装 Docker (转载)
在Ubuntu中安装Docker和docker的使用1.在Ubuntu中安装Docker更新ubuntu的apt源索引sudo apt-get update安装包允许apt通过HTTPS使用仓库sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ so...
2020-10-31 21:17:00
192
原创 GC析构对象和列表的处理过程
步骤如下:1.CLR 会判断当前对象是否包含析构函数,2.如果包含,则记录对象的地址到所属区域下的析构对象列表中3.在CLR GC的五个阶段的标记阶段,会判断对象是否存活为14.如果不为1,检查对象头中的一直运行析构函数标记是否为15.如果为1,则删除析构对象列表的中的记录6.如果不为1,则把析构对象列表中的记录移动到析构队列或者重要析构队列7.标记析构队列和重要析构队列的对象为存活对象,即为18.等待被析构函数的调用线程调用它9.移除析构队列或者重要析构队列10.下一轮GC的回收**
2020-10-27 12:21:54
290
1
原创 .Net Core CLR 获取跟对象代码的分析
.Net Core CLR GC 的第一步过程就是标记阶段,其余的分别为,标记,计划,压缩,重定位,清扫。五个阶段。首先来看下标记阶段,所谓的标记阶段,就是CLR 会标记存活的对象,以便于不被清扫掉,而造成程序异常。标记的第一步首先是要获取到跟对象,通过跟对象获取到正在使用的对象,然后进行一个标记,所有代码均为C++如下:CLR的GC阶段的标记函数为:void gc_heap::mark_phase (int condemned_gen_number, BOOL mark_only_p){
2020-10-18 19:12:42
319
原创 天地有情尽白发,人间无意了沧桑
从此,我叫八戒天蓬苍老的面容,几根丝丝白发。爱情之折磨人,以至于斯乎?我自有仙子相配,爱你就会变成猪一语成谶,因果循环,报应轮回,屡试不爽。爱上宝儿,就会成为平凡人。位列上神,就会离开宝儿。当天蓬毫不犹豫的选择宝儿的时候,那根月老的牵丝线已经被取出。结局是悲哀的。然而没有悲哀的结局,何来感人的故事?四百八十年后,高家庄,永世不得位列仙班的天蓬戴着破败的斗笠。被惊呼为妖怪...
2020-07-05 13:44:00
468
原创 狼和羊的故事(安徒生新篇)
从前,有一群羊,在草原上很安定的生活着。由于水草丰盛,羊群很快繁殖了大量的小羊。小羊长大了继续繁殖,羊群的羊越来越多。后面来了几只狼,对羊说:附近好多狮子老虎,我们保护你们,你们尽情吃草。羊说,好的,救世主来了。狼不吃草,隔三差五的偷吃一只羊。羊群慢慢的减少了,狼一看不对劲。这样减少下去,后面我们吃什么。就对羊说,你们要多生小羊,我们狼才能更好的的保护你们。羊群一听,觉得也是,于是...
2020-06-28 11:55:00
898
原创 .Net Core CLR GC的浅度分析
.Net Core CLR 的GC分为两个部分,一个是GC的内存分配,另外一个是GC的垃圾回收。这里我们先讲一下垃圾回收。一.垃圾回收的触发条件1.在C#代码中调用 GC.Collection();2.物理内存不足的情况下3.分配量超过分配阈值4.找不到可分配的内存空间在满足了以上四个条件中的任何一个,CLR都会触发GC的垃圾回收,清理托管堆空间释放内存,以便下次使用。二.垃圾回收的...
2020-06-27 01:03:00
283
原创 CLR GC分析
.Net Core CLR 的GC分为两个部分,一个是GC的内存分配,另外一个是GC的垃圾回收。这里我们先讲一下垃圾回收。一.垃圾回收的触发条件1.在C#代码中调用 GC.Collection();2.物理内存不足的情况下3.分配量超过分配阈值4.找不到可分配的内存空间在满足了以上四个条件中的任何一个,CLR都会触发GC的垃圾回收,清理托管堆空间释放内存,以便下次使用。二.垃圾回收的流程1停止其它线程到并且切换到抢占模式(抢占模式不可访问托管堆代码,只可访问非托管)2.重新定位回收的目标代
2020-06-26 23:57:22
729
原创 .net core 的夸代扫描标记card_table的细节分析
夸代扫描,比如说回收短暂代,但是在短暂代当中有一个被一代引用的变量。这个时候可能会造成了这个变量被回收,程序发生不可与之错误。card table 就是为了预防这种情况的一个数组。 int p = 0; int* card_table= &p;card_table[0] = 1;card_table[1] = 2;card_table[2] = 3;card_table表在...
2020-05-21 18:16:00
294
原创 .net core 处理异常的精髓部分
.net core 里面处理异常无论是在linux 或者是widnows都有一个异常入口函数processclrexception()core里面的异常分为用户异常和硬件异常,前者是代码里面引发的异常,后面是CPU寄存器硬件等引发的异常两者处理不同在于VEH扩展,当硬件异常的时候,会调用注册的VEH处理异常。而后进入processclrexception,用户异常则省略了VEH部分直...
2020-05-05 14:08:00
362
原创 .Net Core监控文件改动
static void Main(string[] args) { IFileProvider fileProvider = new PhysicalFileProvider(Environment.CurrentDirectory); Action<object> callback = null; ...
2020-01-16 15:31:00
943
原创 .Net Core Linux 下面的操作
这里以 Ubuntu 8.04版本为例: 1.注册 Microsoft 密钥注册产品存储库安装必需的依赖项 wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-pro...
2020-01-09 22:22:00
221
原创 windebug(转载别人的节选)
问题一:WinDBG分X86和X64两个版本 如果你用的是32位的WinDBG,那直接打开就行;你如果用的是64位的版本,那么如果调试64位代码也直接打开,如果调试x86的代码,要使用Wow64下的WinDBG.exe。 问题二:确定SOS和CLR的位置和版本 如果安装了Visual Studio的机器,可以打开VS的命令行,输入where sos.dll命令,可以...
2019-11-20 14:02:00
286
原创 .Net PE
// ConsoleApplication26.cpp: 定义控制台应用程序的入口点。//#include "stdafx.h"#include <Windows.h>typedef ULONG_PTR TADDR;#define VAL16(x) x#define VAL32(x) x#define DPTR(type) type*#...
2019-11-15 16:01:00
344
原创 wpf 画五角星函数
public void ABC() { var canvas = new Canvas(); Content = canvas; var points = new List<Point>() { new Point(2...
2019-10-11 14:40:00
2515
原创 Gradle 编译spring 坑
首先 gradlew.bat其次 import-into-eclipse.bat转换spring-beans文件,将当前目录切换至spring-beans目录,执行命令gradle cleanidea eclipse遇到了一个错误:解决方法:将spring-beans文件夹下面的spring-beans.gradle文件最后三行注释掉去,再在终端执行命令gradle cle...
2019-09-26 10:29:46
762
原创 .Net Core CLR FileFormat Call Method( Include MetaData, Stream, #~)
#include "pch.h"#include <iostream>#include <Windows.h>#define VAL32(x) x#define VAL16(x) x#define DPTR(type) type*typedef DPTR(IMAGE_DOS_HEADER) PTR_IMAGE_DOS_HEADER;typedef ...
2019-08-01 15:41:00
414
原创 Core CLR Host 源码分析(4)
当CLR实例化PEAssembly 的时候,会调用 PEAssemblyHolder pFile(pDomain->BindAssemblySpec(this, fThrowOnFileNotFound, fRaisePrebindEvents, pCallerStackMark));实际上分为三步:Java/Python/Go/.Net讨论交流群:6768173081.通过 ...
2019-05-08 17:14:42
398
原创 Core CLR Host 源码分析(三)
接上一篇,Core CLR利用LoadDomainAssembly加载程序集,并且运用了.net 或者Java里面的全局注入形式来操作程序集的生成和运作具体代码如下:Java/Python/Go/.Net讨论交流群:6768173081.首先会获取到 AppDomain的实例2.获取到ICLRPrivBinder的实例,这个ICLRPrivBinder可以利用assemblyspec.S...
2019-04-04 16:18:39
555
1
原创 Core CLR Host源码分析 (二)
废话不多说,直接上源码:1.在托管程序集里面执行方法HRESULT CorHost2::ExecuteAssembly(DWORD dwAppDomainId,//通过CreateAppDomainWithManager创造的domainid LPCWSTR pwzAssemblyPath,//要托管的...
2019-03-28 16:39:19
468
原创 Core CLR Host 源码分析(一)
Core CLR Host 源码简单分析在定制 CLR Host的时候,可以通过调用如下代码,来获取当前需要被宿主的程序调用入口:Java/Python/Go/.Net讨论交流群:676817308hr = Host->CreateDelegate(domainId,L"Main,Version=1.0.0.0", L"Main.Program", // Target man...
2019-03-25 17:00:00
745
原创 Core CLR 自定义的Host官方推荐的一种形式(第一种)
Core CLR 自定义的Host官方推荐的一种形式(第一种) .Net Core CLR提供两种Host API访问 托管代码的形式,按照微软官方的说法,一种是通过CoreClr.DLL来直接调用托管生成的DLL程序集,另外一种是通过CoreClr里面的C导出函数GetCLRRuntimeHost获取到IID_ICLRRuntimeHost4然后...
2019-03-21 15:26:00
668
原创 编写自定义 .NET Core 主机以从本机代码控制 .NET 运行时
自定义 .Net Core 主机运行.Net Core代码,以及控制运行时运行状态,是在.Net Core 高级运行环境以及定制.Net Host ,CLR 等必不可少的。注意点:1.必须以 x64形式 Debug程序,否则loadlibrary 运行之后为零2.所有的路径都必须放在(Product\Windows_NT.x64.Debug)下面,因为程序要加载默认DLL,缺少DLL将...
2019-03-13 16:48:09
893
原创 C# 二维码的生成
C# 二维码的生成 nuget 搜索qrcodenet,然后选择下载gma.qrcodenetpublic partial class Form1 : Form { public Form1() { InitializeComponent(); } ...
2019-01-17 14:16:00
347
原创 Common Language Runtime(CLR)C++分配堆段小对象叙述
通常来说,内存中的划归为CLR的堆,在CLR中被分两个对象,分别为小对象和大对象,小对象包含了三代,分别为0代,1代,2代,大对象只有一个代就是3代。CLR分配内存的时候,首先尝试从自由列表(a_fit_free_list_p)分配,如果没有成功,则从堆段中分配。代码如下:BOOL gc_heap::a_fit_free_list_p (int gen_number, ...
2018-12-29 17:17:01
384
原创 .Net Core核心监听模块LibUv
这几天发现,.Net Core核心中的核心,也就是作为服务器的监听部分,居然用的是Node.Js的LibUv。.Net Core 作为微软最新的一款开源技术栈,其最大的创新就是用KestrelHtppServer构建了自己的专属服务器,取代了传统的IIS作为服务器,也是为了对抗Java Tomcat ,Apache的利器。这款KestrelHtppServer的核心正是 LibUv。在.Net...
2018-12-15 20:42:46
1782
1
c# dll注入钩子(全局钩子)
2012-06-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人