【问题标题】:F# Debugging. CLRF# 调试。 CLR
【发布时间】:2012-05-19 15:33:07
【问题描述】:

我想进一步了解为某些功能生成的 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... 等(但可能错过了一个)很明显我做错了什么,我也尝试过使用 module 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

【问题讨论】:

    标签: debugging f# clr windbg sos


    【解决方案1】:

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

    【讨论】:

    • 史蒂夫,谢谢你的回复,我不知道 SosEx,很酷。编辑:我疯狂尝试 !mbm *main*; !mbm *测试*;但我无法打破它,我是否误解了通配符要求? Edit2:固定通配符。
    • 欢呼,!mbm *!Test.main 有效!现在,为什么这不能与 !bpmd 一起工作? (还有 SosEx 的可用资源吗?)
    • 出于各种原因,一些个人的,一些合法的,我保持关闭源。虽然我在 MS 工作之前就写过 sosex,但现在我在这里并继续在 sosex 上工作,我不能冒险将机密细节泄露出去。
    • 了解,如果有人有兴趣学习为托管代码编写 dbg 扩展,是否有可用的公共资源?如果有一个 .net 库可以像您的扩展一样查看 post jit asm 但在调试器之外会很酷!编辑:错字
    • 不幸的是,调试托管代码的方法都没有记录。我从转子资源中了解到。 Rotor 包含旧版本 SOS 的源代码。自Rotor以来,接口和数据结构发生了显着变化,因此我不得不依靠逆向工程来填补一些空白。
    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 2019-08-22
    • 2011-05-20
    • 2012-01-16
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多