namespace TestConsole{ public class MyArrayList { public MyArrayList(int length) { this.m_items = new object[length]; } private object[] m_items; public object this[int index] { [MethodImpl(MethodImplOptions.NoInlining)] get { return this.m_items[index]; } [MethodImpl(MethodImplOptions.NoInlining)] set { this.m_items[index] = value; } } } public class MyList<T> { public MyList(int length) { this.m_items = new T[length]; } private T[] m_items; public T this[int index] { [MethodImpl(MethodImplOptions.NoInlining)] get { return this.m_items[index]; } [MethodImpl(MethodImplOptions.NoInlining)] set { this.m_items[index] = value; } } } class Program { static void Main(string[] args) { MyArrayList arrayList = new MyArrayList(1); arrayList[0] = arrayList[0] ?? new object(); MyList<object> list = new MyList<object>(1); list[0] = list[0] ?? new object(); Console.WriteLine("Here comes the testing code."); var a = arrayList[0]; var b = list[0]; Console.ReadLine(); } }}我们在这里构建了两个“容器”,一个是MyArrayList,另一个是 MyList<T>,前者直接使用Object类型,而后者则是一个泛型类。我们对两 个类的索引属性的get和set方法都加上了NoInlining标记,这样便可以避免这种 简单的方法被JIT内联。而在Main方法中,前几行代码的作用都是构造两个类的对 象,并确保索引的get和set方法都已经得到JIT。在打印出“Here comes the testing code.”之后,我们便对两个类的实例进行“下标访问”,并使控制台暂 停。
当Release编译并运行之后,控制台会打印出“Here comes the testing code.”字样并停止。这时候我们便可以使用WinDbg来Attach to Process进行调 试。老赵也是在这个时候制作了一个dump文件,您也可以Open Crash Dump命令打 开这个文件。更多操作您可以参考互联网上的各篇文章,亦或是老赵之前写过的 一篇《使用WinDbg获得托管方法的汇编代码》。