我想多看看为某些功能生成的 ASM (F#->IL->ASM),纯粹是出于好奇和学习。
我心中的答案是使用 SOS.dll,但我遇到了一些障碍......
让我们从 F# 中最基本的代码开始。文件名为 test.fs。
[<EntryPoint>]
let main _ =
stdin.ReadLine()
1
我们正在定义一个入口点,它采用 'a (由于明显的原因(琐事:不能在入口点函数中使用“'a”?),但没有告诉我们 (?) 到字符串数组的约束)。然后我们等待用户输入。这使得在 windbg 中手动破解变得容易得多。编译 test.fs 生成 test.exe
打开windbg,打开windbg里面的test.exe:
>!load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
>g
Windbg 将运行我们的代码并等待 readline 循环,然后我们可以在控制台窗口中输入一些内容,windbg 将退出。
现在,我们如何在 main 上放置一个断点,以便我们可以在readline 循环之前中断?
>!bpmd test.exe Test.main; g
然后windbg将进入readline循环......我期待它在readline循环之前中断,断点必须定义不明确。在此之后,我尝试了许多断点变体: !bpmd test.exe Test.main; !bpmd test.exe 测试;!bpmd test.exe 主程序;!bpmd test.exe 主要;!bpmd test.exe Main.test !bpmd test.exe Test... 等(但可能错过了一个)很明显我做错了什么,我也尝试过使用模块 xx = ...,
问题:谁能告诉我如何使用 SOS 扩展从 windbg 中在 F# 托管代码中放置断点?
参考:
http://winterdom.com/2011/06/have-fun-with-windbg
http://social.msdn.microsoft.com/Forums/en-US/clr/thread/a0ab6170-d53b-4c95-8f5e-efaf4e014fcd
http://blogs.msdn.com/b/vancem/archive/2006/09/05/742062.aspx