2012-02-07 7 views
0

私はC#のネイティブコード生成で遊んでいます。私はHeapCreateHeapAllocを使用して、x86-64命令を書き込む実行可能メモリを割り当てています。次にMarshal.GetDelegateForFunctionPointerを使用して.NETデリゲートに変換して呼び出します。私は適切に作成し、定数値を返す単純な関数を呼び出すことができます。.NETアプリケーションで割り当てられた実行可能メモリをステップ実行

問題は、私がVS2010でその機能に入ることができないことです。コール・オペコードの逆アセンブリウィンドウで「ステップイン」を使用すると、単にステップオーバーして、逆アセンブルされた機能が表示されることはありません。逆アセンブリウィンドウで実行可能メモリアドレスを参照しようとしましたが、そのアドレスにブレークポイントを追加しましたが、Visual Studioはメモリが実行可能ではないと訴えています。私も "int 3"命令を生成しようとしましたが、警告なしでアプリケーションが終了するだけです(Environment.Exitが呼び出されたように)。私はC++で同じテクニックを使って関数を生成して呼び出す簡単なテストプログラムを実行しました。問題なく呼び出していくことができます。

.NET Visual Studioプロジェクトで割り当てられた実行可能メモリのチャンクで生成したネイティブ関数にステップインするにはどうすればよいですか?これができないようにするものは何ですか? (私は「私のコード」オプションをチェックしていません)

答えて

1

MSDNに記載されているように「管理されていないコードのデバッグを有効にする」を設定しましたか?

+0

私はそのような旗しか忘れていないと思った。 Visual Studioはまだ何らかの理由で呼び出しに入ることはありませんが、 "int 3"ブレークポイントをインジェクトすると機能し、そこからステップできます。理想的ではありませんが、私はこのように働くことができます。ありがとう! – Trillian

1

本当にHeapAllocを使用している場合は、これがまったく機能していないのは驚きです。私はHeapAllocによって割り当てられたメモリには実行許可がないという印象を受けました。私は通常VirtualAllocを使ってこのようなメモリを割り当て、VirtualProtectで明示的に実行フラグを設定します。

+0

HeapCreateは、HEAP_CREATE_ENABLE_EXECUTEフラグ(ヒープのコードを実行するアプリケーションでこのフラグヒープを使用します)を提供します。私はVirtualAllocで試してみませんでしたが、それはより複雑に使用するようです。 – Trillian

関連する問題