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 が終了します。

では、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

4

1 に答える 1

5

*/? でメソッド フィルターを取得する !sosex.mbm を試してください。コマンドラインのようなワイルドカード構文。また、ソース ファイル、行番号、およびオプションの列番号を受け取る !sosex.mbp も試してください。逆アセンブルするには、!sos.dumpil または !sos.U を使用します。ソース/IL/ネイティブのインターリーブ逆アセンブリについては、!sosex.muf を試してください。

于 2012-05-11T02:35:58.300 に答える