5

我想多看看为某些功能生成的 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

4

1 回答 1

5

试试 !sosex.mbm,它采用带有 */? 的方法过滤器。通配符语法类似于命令行。也可以试试 !sosex.mbp,它接受一个源文件、行号和可选的列号。要反汇编,请使用 !sos.dumpil 或 !sos.U。对于 source/IL/native 的交错反汇编,试试 !sosex.muf。

于 2012-05-11T02:35:58.300 回答