システムヒープの内容を印刷して分析したいです。明らかに、これは特権的な作業でなければならず、GDBの目的を崩すことができます。
特に、ヒープのプロセス部分だけでなく、システム全体のヒープをスキャンしたいと思います。
gdbはこれを行うことができますか?可能であれば、どのコマンドでこれを実行できますか?そうでなければこれを行うことができるツールはありますか?
必要に応じて、これを行うためにカスタムドライバ/デバッグカーネル/中断点を設定します。
答え1
まず、次の基本知識を知る必要があります。仮想メモリ。 MMUがどのように機能するかを理解する必要はありませんが、仮想アドレス空間とは何か、仮想アドレスまたは物理アドレスをいつ処理するのかを理解する必要があります。そうでなければ、あなたが見るすべてを理解していないでしょう。
Linuxでは、以下を使用してシステムの物理メモリにアクセスできます。/dev/mem
: バイト窒素of/dev/mem
はバイトです窒素RAMまたはメモリマップされた周辺機器。何を探すべきか、どこを見るべきか既に知っていない場合は、そこで興味深いものを見つけるのは難しいでしょう。このファイルは、/proc/iomem
物理アドレス空間(RAMと周辺機器)にマップされた内容を説明します。
以下を使用してカーネルの仮想メモリにアクセスできます。/dev/kmem
これにより、カーネルコードとデータ構造はもちろん、現在カーネルにマップされているデバイスにアクセスできますが、プロセスメモリにはアクセスできません。 Linuxにも/proc/kcore
同様の機能がありますが、/dev/kmem
カーネルでデバッガの実行を容易にするためにELFヘッダを最初に配置します。デバッガは/proc/kcore
プロセスのメモリのようにそれを開いて作業できます。以下を実行して、実行中のカーネルをデバッグできます。gdb /path/to/vmlinux /proc/kcore
(特にリモートデバッグなど、より便利な機能があります。)
次の方法でプロセスの仮想メモリにアクセスできます。/proc/$PID/mem
。このファイルには、/proc/$PID/maps
プロセスアドレス空間にマップされた内容がまとめられています/proc/$PID/smaps
。
「システムヒープ」や「中央集中型ヒープマネージャー」などはありません。一番近いのはシステム全体のメモリそしてメモリマネージャ(アーキテクチャ関連部分を除いて、Linuxではすべて〜100kLoC)