5

デバッグセッションで、残念ながらゴミを指しているアドレスがあるとします。そして、その周りの記憶を調べて、近くに何があるかを調べたいと思います。予想通り、次のエラーが発生します。

(gdb) x/64 $t5
0x842da7ac:     Cannot access memory at address 0x842da7ac

では、問題は次のとおりです。アドレスの範囲を読み取る方法はありますか?その一部は有効ではありませんか?

$t5+n(より正確には、上記の例で有効なアドレスがあることをどのように知ることができますか0 < n <= 64?)

4

1 に答える 1

7

無効なアドレスを読み取ることはできません(明らかに)。

一部のOSでは、プロセスがGDBで停止しているときに、有効なアドレスについてOSにクエリを実行できます。たとえば、Linuxでは、cat /proc/<pid>/maps有効なアドレス(およびそれらが有効なアクセスモード)に関する情報が表示されます。他のOSも同様のメカニズムを持っている可能性があります。

質問post-mortemにタグを付けたため、上記のメカニズムを使用することはできません。しかし、あなたはcoreファイルを持っている必要があります。Linux(およびその他のELFシステム)では、readelf -l coreメモリのどの領域がコアに書き込まれたかがわかります。これにより、通常、クラッシュ時に有効だったメモリがわかります。ただし、通常、読み取り専用マッピングはに書き込まれないcoreため、出力にそのようなマッピングが表示されない場合がありreadelfます。

最近のすべてのOSはページングを使用しており、ページは少なくとも1K(より一般的ですが)ページであるため、有効である可能性4Kのある最も近いメモリは、など(バイト)であることがわかります。$t50x842da800n >= 84

最後に、GDBに64語を調べるように依頼し、GDBが最初の単語を調べることができない場合、GDBは停止します。

ただし、GDB-7.xを使用している場合は、Pythonで一度に1つの単語を検査するようにGDBに要求でき、GDBは、その特定の単語を検査できない場合、Python例外をスローします。しかし、Pythonの例外をキャッチできるので、Pythonで「次のN語を調べ、読めない単語を無視する」を実装するスクリプトを作成するのは簡単です(これは、「これをどのように行うことができるか」という質問に答えると思います)。

于 2010-09-22T04:55:04.640 に答える