我想更多地了解为某些功能生成的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
试试!sosex.mbm,它带有*/?的方法过滤器 通配符语法,如命令行.还可以尝试!sosex.mbp,它获取源文件,行号和可选列号.要反汇编,请使用!sos.dumpil或!sos.U.对于源/ IL/native的交错反汇编,请尝试!sosex.muf.
| 归档时间: |
|
| 查看次数: |
278 次 |
| 最近记录: |