純粋に好奇心と学習のために、特定の関数に対して生成された結果の 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 が終了します。
では、readline ループの前でブレークできるように、main にブレークポイントを配置するにはどうすればよいでしょうか。
>!bpmd test.exe Test.main; g
その後、windbg は readline ループに入ります... readline ループの前にブレークすることを期待していましたが、ブレークポイントが正しく定義されていない必要があります。これに続いて、ブレークポイントのさまざまなバリエーションを試しました。!bpmd test.exe テスト; !bpmd test.exe メイン; !bpmd test.exe メイン; !bpmd test.exe Main.test !bpmd test.exe Test... ect (ただし、見逃している可能性があります) 何か間違ったことをしているのは明らかです。モジュール 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