我想调试[MethodImpl(MethodImplOptions.InternalCall)]
BCL 方法的实现,该方法可能是用 C++ 实现的。(在这种特殊情况下,我正在查看 System.String.nativeCompareOrdinal。)这主要是因为我很爱管闲事,想知道它是如何实现的。
但是,Visual Studio 调试器拒绝进入该方法。我可以在这个调用上设置一个断点:
"Hello".Equals("hello", StringComparison.OrdinalIgnoreCase);
然后调出 Debug > Windows > Disassembly,单步执行 Equals 调用,然后单步执行,直到找到call
x86 指令。但是,当我尝试对其使用“Step Into” call
(我从 Reflector 知道是 nativeCompareOrdinal 调用)时,它并没有像我想要的那样进入 nativeCompareOrdinal 中的第一条指令——而是跨步,直接进入Equals 中的下一条 x86 指令。
我正在构建为 x86,因为 x64 应用程序不支持混合模式调试。我在“工具”>“选项”>“调试”中取消选中“仅我的代码”,并在“项目属性”>“调试”选项卡中选中“启用非托管代码调试”,但它仍然跳过call
. 我还尝试启动该过程,然后附加调试器,并显式附加托管调试器和本机调试器,但它仍然不会进入该 InternalCall 方法。
如何让 Visual Studio 调试器单步执行非托管方法?