摘要:无疑,一个Object在CLR中的逻辑结构是相当复杂的。前段时间,写了一篇CLR探索系列:System.Object内存布局模型及实现研究,侧重从System.Object这个基本类的基本内存布局,实现和结构来研究了下。这是远远不够的。今天就从如何存储一个Object中的Field,Method等信息,这些信息的逻辑组织方式和存储的逻辑结构。废话不多说,看看就知道了:首先,给一个图: 这个图,显示...
阅读全文
摘要:吃饭回来,看到Share Source CLI团队的rss聚合上面Debug团队的juqiang发了一篇文章,说抓了一个minidump出现了:WARNING: Unable to verify timestamp for mscorwks.dll的错误。上次我在查看一个mini Dump的时候,ntdll.dll好像也出现过这个问题,当时把符号文件重新加载了一次就OK了。这次看到他出现了同样的问...
阅读全文
摘要:前些天,发布了一个能够在Visual Studio2005查看sscli源代码的项目文件。不过,在VS2008中编译sscli,会出现一大堆错误。这里,有幸在Jeremy Kuhne's Blog上面找到了一篇文章来解决这个问题。原文链接可以点这里。这里,时间原因就不翻译过来了,希望对sscli团队中研究这个的同志们有帮助,特别希望“装配脑袋”能看到这篇文章。The currently avail...
阅读全文
摘要:我想,有过研究sscli 2.0源码经历的朋友们看到这个标题,一定挺的高兴吧。在以前参阅SSCLI2.0的源码的时候,一直用的EditPlus。感觉在整个VM或者是PAL目录下面寻找对一个类的应用或者一个方法的定义相当的不方便。经常F3搜索整个目录中文件包涵的一个字符串,而且经常一不留神按F3大盘就出来了....这里发布一个项目文件,做为Share Source CLI团队的第一个团队资源。还有一...
阅读全文
摘要:一直都想写篇文章来说说那些尘封在PE/Coff文件格式下的那些事,还有Metadata和EEClass是如何表现了一个静态的PE格式文件在内存中的映射结构。在这篇文章里,我不去介绍windows下PE文件的具体格式,也不去介绍一个托管或者是非托管PE文件的加载运行方式,更加不去介绍一个PE文件里面的各个头部以及整体结构的各个部分的含义。而是侧重于介绍,基于托管环境下,DotNet对基本的PE/Co...
阅读全文
摘要:你是否真正的了解你所认识的.NET?Rotor、Mono?垃圾收集器、类装入器、类型系统、错误报告系统、应用程序域、配件、代理支持、反射、安全性和代码管理器等等等等的架构、实现。在实现这些名词中遇到的有趣的问题和睿智的解决方案。 在对新技术的追踪和应用中,国内的技术爱好者已经能基本上跟上国外同行的步伐。而对于.Net比较核心的基本技术,高级调试技术,FrameWork架构细节及其实现的研究,与国外...
阅读全文
摘要:上次提出了一个问题:一个托管进程,如果运行在一个双核CPU的机器上,GC是运行于Server GC模式,在假设CPU没有Hyper thread功能的话,这个托管进程会有几个GC Thread?可以用调试工具来证明你的判断吗?这个问题的答案,想必很多人也知道,几个cpu就几个GC Thread。不过接下来的内容,主要侧重于,变换几种不同的方式来解决这个问题:方法一:在WinDBG中,加载SOS模块...
阅读全文
摘要:近日研究CLR和GC,在msdn blog上面看到MS CLR测试小组的一个女技术员提出了十几个问题,感觉问题都挺有趣,也有一定的难度,遂加以修改,删除了几个又添加了几个,广泛征集回答 ^_^1. 一个托管进程,如果运行在一个双核CPU的机器上,GC是运行于Server GC模式,在假设CPU没有Hyper thread功能的话,这个托管进程会有几个GC Thread?可以用调试工具来证明你的判断...
阅读全文
摘要:首先推荐一本书:Garbage Collection: Algorithms for Automatic Dynamic Memory Management (Hardcover)如果对GC的自动内存管理算法比较感兴趣的话,可以参阅下这本书。在亚马逊上的链接:http://www.amazon.com/exec/obidos/ASIN/0471941484/qid=1030028976/sr=1-...
阅读全文
摘要:在CLR的垃圾回收子系统中,Card Table和Brick Table是两个比较有意思的表。 在GC的过程中,一个Heap在运行了一段时间以后,已经分配的空间就会越来越大。在进行了一次局部代或者是完全的垃圾回收以后,就会涉及到一个GC堆的类似碎片整理的概念。整理优化一次GC Heap。同时,这种机制保证了譬如一个IIS Server在长时间的运行过程中的稳定性并且优化了其内存管理。 这样的好处...
阅读全文
摘要:在CLR探索系列的研究DotNet下的垃圾回收器这几个博文里,就先说说GC Heap结构吧,至于垃圾回收的详析算法实现,以后再写了。在一个托管进程被创建以后,在托管进程的内存空间里面,包含了System Domain,Shared Domain,Default Domain,以及一系列的Heap,有Process的Heap,JIT Code Heap,GC Heap以及LOH。在DotNet的CL...
阅读全文
摘要:只有深究最本质的东西,才能把握最本质的东西。有很多朋友都分析过System.Object作为Dotnet Framework里面的一个基类,她的特性、方法特点及其相关的概念,这篇博文里面,我就从System.Object这个基类的定义以及底层实现的角度,探索这个基类对象在内存里面的布局模型,探索这个基类最本质的面目。首先,从一个Type的实例在内存里面的布局模型、以及一个实例的各个部分在一个托管进...
阅读全文
摘要:在从托管代码里面调用非托管代码的时候,经常会翻阅MSDN找到需要调用的这个程序集里面的关于需要调用方法的签名,还要特别注意方法签名的写法。而且,有的时候我们找到一个非托管代码,对里面的调用方式还没有参考文档。这个boring的过程,以前我们可以利用MSDN,相关模块的参考文档,或者利用PInvoke.net这个网站来搞定。或者,我也见过一些同行找到了一个小工具P/Invoke wizard,用这个...
阅读全文
摘要:在CLR的世界中,有一系列的令人Amazing的技术和架构。其中,CLR对应用程序在内存中内存分配,执行模型,程序之间的交互等一系列的技术,值得每一个致力于DotNet平台的技术人员深究。编程人员在开发的过程中,如果把程序集的加载(Assemblies Load),反射(Reflection),寄宿(Hosting),应用程序域(AppDomain),这四种技术结合起来使用的话,不仅能更好的使用C...
阅读全文
摘要:在使用VS进行托管应用程序的调试的时候,有的时候总感觉有些力不从心。譬如查看一个托管堆或者计算堆栈的时候,VS就不能胜任了。这个时候,Windbg+SOS扩展调试模块就为我们提供了一个很好的解决方案。我们看一段代码:class Program { static void Main(string[] args) { Program b = new Program(); b.test(); Syste...
阅读全文