F# Interactiveでunmanagedコードをデバッグ

F# Interactiveでデバッグをする際は、Interactiveウィンドウ上で右クリックメニュー"Start Debugging"を利用するか、fsxファイル上で右クリックメニュー"Debug In Interactive"を利用すると思います。

しかしこの方法ではデバッガがマネージドコードのみを対象としてしまうため、ネイティブのソースコード内のブレークポイントにはヒットしません。

通常、.Netのアプリをデバッグする際、プロジェクトの"アンマネージコードデバッグを有効にする"を有効にすればネイティブコードもデバッグが可能になります。
f:id:any-programming:20180919173911p:plain

しかしF# Interactiveのexeは上記オプションが有効になっていないため、デバッガがマネージドモードで起動されます。(と思います。)

下記に示すデバッガのネイティブモードでの起動は、特段F# Interactiveに限ったものではなく、汎用的に利用できる方法です。

ネイティブモードでデバッガ起動

"デバッグ"→"プロセスにアタッチ"でダイアログを表示します。

対象プロセス(今回はfsi.exe)を選択し、アタッチ先を"ネイティブコード"に変更して、アタッチします。
f:id:any-programming:20180919174623p:plain

後はF# Interactive上でコードを実行すればネイティブコード内のブレークポイントにヒットするようになります。

そのかわりマネージドコードのブレークポイントにはヒットしなくなります。(アタッチ先で"マネージド/ネイティブ"が選択肢にないみたいです。)