F#调试.CLR

5 debugging clr f# windbg sos

我想更多地了解为某些功能生成的ASM(F# - > IL-> ASM),完全出于好奇和学习.

在我的脑海中回答是使用SOS.dll,但我遇到了一些障碍......

让我们从F#中最基本的代码开始.文件名为test.fs.

[<EntryPoint>]
  let main _ = 
    stdin.ReadLine()
    1
Run Code Online (Sandbox Code Playgroud)

我们正在定义一个入口点,它带有'a'(由于显而易见的原因而没有告诉我们(?)到字符串数组的限制(琐事:在入口点函数中不能使用"a")).然后我们等待用户输入.这使得在windbg中手动破解变得更加容易.编译test.fs以生成test.exe

打开windbg,打开windbg里面的test.exe:

>!load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
>g
Run Code Online (Sandbox Code Playgroud)

Windbg将运行我们的代码并等待readline循环,然后我们可以在控制台窗口中键入一些内容,windbg将退出.

现在,我们如何在main上放置一个断点,以便我们可以 readline循环之前断开?

>!bpmd test.exe Test.main; g
Run Code Online (Sandbox Code Playgroud)

windbg然后将进入readline循环...我期望它在readline循环之前中断,断点必须是不明确的.在此之后,我尝试了许多断点的变体:!bpmd test.exe Test.main; !bpmd test.exe测试; !bpmd test.exe main; !bpmd test.exe Main; !bpmd test.exe Main.test!bpmd test.exe测试...等(但可能错过了一个)很明显我做错了什么,我也尝试过使用模块xx = ...,

问:有人能告诉我如何使用SOS扩展从windbg中的F#托管代码中放置断点吗?

参考文献:

http://winterdom.com/2011/06/having-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

Ste*_*son 5

试试!sosex.mbm,它带有*/?的方法过滤器 通配符语法,如命令行.还可以尝试!sosex.mbp,它获取源文件,行号和可选列号.要反汇编,请使用!sos.dumpil或!sos.U.对于源/ IL/native的交错反汇编,请尝试!sosex.muf.