2011-02-04 17 views
2

私のプロジェクトは3つのプロセスで構成されています。プロセス1はプロセス2および3の「サーバ」であり、共有メモリを実装します。プロセス2はアプリケーションエラーでランダムにクラッシュし、それ自身のメモリにアクセスしようとしましたが、何らかの方法で壊れています。あるプロセスが別のプロセスのメモリを上書きできますか?

エラー: メモリ位置の一部のアドレスに無効な命令があります。アドレスが正しくありません。

プロセス1でどのような種類のものを探して、プロセス2のメモリを上書きしているのか確認します。

ありがとうございます。

+1

"その他"のプロセスである必要はありません。プロセス2にバグがある場合、それは完全に独自のメモリフットプリントでストンプすることができます。 –

答えて

6

誤って別のプロセスのメモリを上書きします(その協力なし)。いいえ、あなたが「うっかり」多くのことを正しく行う必要があるからです。 (あなたは「偶然」プロセスへのハンドルを開き、また「偶然」WriteProcessMemoryと呼ぶ必要があります)

意図的ですか?はい、WriteProcessMemory機能を使用しています。

*メモリを共有している場合は、エラーが発生する可能性が高くなります。

+1

彼は共有メモリがあると言いました。共有メモリの制限を理解していないと間違ってしまうことがたくさんあります。 –

+1

@Ben:あなたは完全に正しいです、私はその部分を逃しました。振り返ってみると、私の答えは投票されるべきです。 :\ – Mehrdad

+0

私はそれが完全に修正可能だと思います。最初の文章(実際には単語)を「誤って別のプロセスのメモリを上書きして、その協力なしに」に変更することをお勧めします。 「他のプロセスがメモリを共有することに同意すると、すべてのベットはオフになります」というメッセージが追加されます。 –

2

共有メモリ内のデータ構造に絶対ポインタが含まれていますか?絶対ポインタは他のプロセスでは意味がないため、悪い考えであるだけでなく、あるプロセスが別のプロセスにメモリを介して乱暴に書き込むことを納得させることができます。

一般に、メモリ管理ユニットは、プロセスが他のプロセスのメモリを直接上書きしたり破損したりするのを防止します。共用メモリ(ファイル・マッピングを含む)およびWriteProcessMemory機能は、一般規則に対する例外です。

3

プロセスは、アクティブにしようとすると、別のプロセスのメモリだけを上書きできます。デバッグは一例であり、共有メモリは別のものです。別のプロセスのコードまたはデータ領域への誤った書き込みはほとんどありません。

問題は、おそらくプロセス2のバグです。つまり、プロセス2はメモリを共有していないのでしょうか?したがって、プロセス1はそれを上書きすることはできません。

+0

私は、コードが上書きされたことを示す質問には何も見ません。 –

3

OSは、カーネルの一部として実行している場合を除き、プロセスが別のプロセスのメモリを上書きしないようにします。 valgrindのようなメモリデバッガを使用して、メモリアクセスエラーの原因を追跡します。

編集:OSコールを使用して別のプロセスのメモリにアクセスする可能性も含めることができますが、誰もが言っているように、そうしない可能性があります。共有メモリにポインタを渡すことは、ここで最も起こりそうなエラーですが、valgrindのようなツールを使用することをお勧めします。

関連する問題