6

gdb のデバッグ中に ni コマンドを実行すると、次のようなエラーが発生しました。

警告:
ブレークポイント 0 を挿入できません
。メモリ アドレス 0x3ac706a へのアクセス中にエラーが発生しました: 入出力エラー。

/lib/libc.so.6 からの siglongjmp () の 0xf6fa4771

gdb が遭遇する問題を調査するために、gdb を strace してそのような出力を取得します。

rt_sigprocmask(SIG_BLOCK、NULL、[RT_1]、8) = 0
ptrace(PTRACE_PEEKTEXT、651、0xcc4fdf60、[0x1cc4fe470]) = 0
ptrace(PTRACE_PEEKTEXT、651、0xcc4fe480、[0x3ac706a4506fa1d]) =
0 ], 8) = 0
…<br> ...
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [RT_1], 8) = 0
ptrace(PTRACE_GETREGS, 27781, 0, 0x7fff8990e8b0 ) = 0
ptrace(PTRACE_PEEKTEXT, 27781, 0x3ac7068, [0x28b]) = -1 EIO (入出力エラー)
ptrace(PTRACE_PEEKTEXT, 27781, 0x3ac7068, [0x28b]) = -1 EIO (入出力エラー)

これは、gdb がメモリ アドレス0xcc4fe480で最初に ptrace を実行し、値0x3ac706a4506fa1d (実際には 8 バイトの値0x03ac706a4506fa1d ) を取得することを意味します。その後、その値の最初の 4 バイトからアラインされたアドレス0x3ac7068を取得します。これは無効なアドレスであり、gdb が ptrace に失敗する原因となります。

/proc/[pid]/maps の内容:

CBCE2000-CC353000 R-XP 00000000 08:03 295479 XXX.SO
CC353000-CC3F0000 R-P 00670000 08:03 295479 XXX.SO
CC3F0000-CC3F6000 RW
P 00:00 0
CC3FE000-CC3FF000 --- P CC3FE000 00:00 0
CC3FF000-CC4FF000 RWXP CC3FF000 00:00 0
CC4FF000-CC500000 --- P

CC4FF000
-xp 00000000 08:03 295545 yyy.so
cc673000-cc674000 ---p 00046000 08:03 295545 yyy.so
cc674000-cc675000 r--p 00046000 08:03 295545 yyy.so
cc675000-cc676000 rw-p 00047000 08:03 295545 yyy.so

アドレス0xcc4fe480が上記の太字のセクションからのものであることを示しています。このセクションは、.so または bin ファイルとは関係ありません。

この質問は、実際には別の質問http://stackoverflow.com/questions/9564417/gdb-cant-insert-internal-breakpointに関連していますが、まだ解決されていません。これらの問題は、前号の調査中に見つかりました。

ここで 3 つの質問があり
ます

最後のパラメーターが角括弧で注釈されているのはなぜですか? 戻り値を表すということですか?マニュアルページには、ptrace は PTRACE_PEEKTEXT に対して読み取った単語を返す必要があると書かれていますが、strace の出力はそれに従っていないように見えるため、最後のパラメーターに戻り値が表示されていると思われます。
2. 2 つの .so の間にセクション (太字の who) がありますが、どの i ノードにも関連付けられていません。そのようなセクションは何を表していますか?
3. Gdb はそのセクションから 1 ワードを読み取り、そのワードをアドレスとして使用しますが、実際には無効なアドレスです。このようなエラーの考えられる原因は何ですか?

ありがとう!

4

2 に答える 2

5
  1. ここでptraceのstrace出力を見てください:ptrace(PTRACE_PEEKTEXT、651、0xcc4fe480、[0x3ac706a4506fa1d])= 0最後のパラメーターが角かっこで囲まれているのはなぜですか?戻り値を表すという意味ですか?

正しい。

  1. 2つの.soの間にセクション(太字のフォント)がありますが、iノードには関連付けられていません。そのようなセクションは何を表していますか?

mmapこれは、フラグが設定されたメモリの領域ですMAP_ANONYMOUNS(つまり、ディスク上のどのファイルにも対応していません)。

その領域のサイズは正確に1MBであり、でマップされたプライベート領域に囲まれているためPROT_NONE、この領域がスタックガードゾーンに囲まれたスレッドスタックを表すことは間違いありません。

  1. Gdbはそのセクションから1つの単語を読み取り、その単語をアドレスとして使用しますが、実際にはそれは無効なアドレスです。そのようなエラーの考えられる原因は何ですか?

何らかの理由で、GDBはアドレスにコードがあるはずだと考えており、そこに内部ブレークポイント0x3ac7068を配置したいと考えています。GDBは、内部ブレークポイントを使用して、ロードされた共有ライブラリを追跡します(特に)。

からの出力は、maintenance info breakGDBが「不良」アドレスに存在すると信じているコードを明らかにする必要があります。

于 2012-03-11T23:06:31.947 に答える
0

私の推測では、あなたのコードはオーバーフローして有効なアドレスを上書きしており、gdb はアドレスを期待してメモリのその領域にアクセスしていますが、ジャンク データを取得しています。デバッグしようとしているコードのセクションは何ですか? それは私たちを助けるかもしれません。

于 2012-03-10T17:50:39.510 に答える