1

したがって、連携して動作する2つのアプリケーションがあります。1つは、カスタムメモリマネージャーを使用してネイティブC++で記述されています。このメモリマネージャは、開始アドレスからstartAddress+サイズまでの連続したバイトブロックを管理します。また、テキストファイル(テキストファイルに注がれたメモリマネージャーからのバイトのみ)を読み取り、それに関するあらゆる種類の統計を表示するWPFアプリケーションもあります。WPFアプリでネイティブc++アプリケーションのメモリをリアルタイムで表示できる方法があるかどうかを知りたいと思いました。したがって、いくつかの疑似ロジックは次のようになります。

  • ネイティブアプリケーションは、何らかの方法で、プールの開始アドレスとサイズを公開する可能性があります
  • WPFアプリケーションは、その開始アドレスから開始アドレスにサイズを加えたものまでのすべてのバイトを取得します

.NETでProcessクラスを調べましたが、MemoryPoolのようなものは見当たりませんでした。そのオブジェクトのStartAddressは、最初に行われたヒープ割り当てではなく、アプリケーションの最初を指していると思います。

ここでの助けは大歓迎です!

4

1 に答える 1

1

コメントのDamien_The_Unbelieverは、必然的に最善の解決策を投稿しました。他の誰かがこの問題に直面した場合に備えて、これを早く投稿しなかったことをお詫びします。アイデアは、メモリマップトファイルを使用して、アプリケーションの外部にメモリのブロックを表示することです。基本的に、メモリのブロックを作成し、それに文字列名(識別子)を付けます。この識別子を知っている他のアプリケーションは、メモリのブロックを自分のものであるかのように読み取ることができます(メモリマップトファイルを使用してメモリを表示していると仮定します。これは、本質的に表示されるだけではないためです)。注意点は、メモリを読み取るアプリケーションは、メモリを解析して理解できる必要があるということです。

これを使用して、エンジン用のC#でリアルタイムメモリビューアーを作成しました。エンジンには、基盤となるアロケータとメモリマネージャがあり、メモリマップトファイルによっても参照されるメモリブロックに書き込みます。C#アプリケーションは、指定された間隔でこのメモリを読み取り、ユーザー(開発者)に適切な方法で表示します。最良の部分は、この実装を使用するためにネイティブ側をまったく変更する必要がないため、これがアプリケーションのパフォーマンスにまったく影響を与えないことです。

于 2013-08-16T19:45:46.993 に答える