8

gdb を使用して、KMines で現在のフラグ数を見つけようとしています。存在しないメモリ位置を避けるために、最初にメモリ マッピングを探す必要があることはわかっています。そこでinfo proc mappings、コマンドを実行してメモリ セグメントを確認しました。結果からランダムなメモリ ギャップ ( 0xd27000-0x168b000) を取得し、次のように find コマンドを実行しました。find 0x00d27000, 0x0168b000, 10

しかし、warning: Unable to access 1458 bytes of target memory at 0x168aa4f, halting search.エラーが発生しました。アドレス 0x168aa4f は 0xd27000 から 0x168b000 の間にありますが、gdb はアクセスできないと言っています。なぜこれが起こるのですか?この状況を回避するにはどうすればよいですか? または、マップされていない/アクセスできないメモリの場所を無視する方法はありますか?

編集: アドレス 0x168aa4f の値を 1 に設定しようとしましたが、機能するため、gdb は実際にそのアドレスにアクセスできますが、find コマンドで使用するとエラーが発生します。しかし、なぜ?

4

1 に答える 1

15

私は自分の問題を解決したと思いますが、解決策がどれほど簡単だったかは信じられません。私がした唯一のことは、2番目のパラメーターの値を1つ減らすことでした。find 0x00d27000, 0x0168afff, 10Linux は [x,y) 形式のマップを使用してメモリを割り当てるため、コードはroot/proc/pid/maps次のようになります。

01a03000-0222a000 rw-p

割り当てられたメモリには 0x01a03000 が含まれますが、0x0222a000 は含まれません。私のこのばかげた間違いが誰かを助けることを願っています:D

編集: 問題の根本は、target.c (つまり、gdb のソース コード) に実装されているアルゴリズムです。アルゴリズムは、16000 バイトのサイズのチャンクとしてメモリを読み取り、検索します。そのため、チャンクの最後のバイトが無効であっても、gdb はチャンク全体をゴミ箱に捨て、無効なバイトに関する適切な情報を提供することさえせず、現在のチャンクの先頭のみを報告します。

于 2016-01-20T23:48:13.520 に答える