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 ワードを読み取り、そのワードをアドレスとして使用しますが、実際には無効なアドレスです。このようなエラーの考えられる原因は何ですか?
ありがとう!