1 つの共有ライブラリ (.so) の関数に 2 つのブレークポイントを追加gdb 7.4
して実行し、プロセスにアタッチしました。
Gdb がブレークポイントにヒットし、n
いくつかのステップを実行したところ、gdb は次のエラーを報告しました (太字のテキスト)。
(gdb) b [関数名]
ブレークポイント 1 at 0xf1f28a49: file ../../../../../[file name].cpp, line 167.
Breakpoint 2 at 0xf1f2dae5: file ../.. /../../../[ファイル名].cpp、60行目
。警告: 複数のブレークポイントが設定されました。
不要なブレークポイントを削除するには、「delete」コマンドを使用します。
(gdb) c
つづく。
[新規スレッド 0xcaafab90 (LWP 28480)]
[スレッド 0xcaafab90 (LWP 28480) 終了]
[新規スレッド 0xcaafab90 (LWP 29558)]
[新規スレッド 0xc8cb6b90 (LWP 29980)]
[スレッド 0xc8cb6b90 (LWP 29980) への切り替え] [
ブレークポイント]関数名] (ostr=..., clientResponse=..., httpProtocol=..., >reqType=...) at ../../../../../[ファイル名]. cpp:60
60 ../../../../../[ファイル名].cpp: そのようなファイルまたはディレクトリはありません。
in ../../../../../[ファイル名].cpp
(gdb) ni
0xf1f2daed 60 in ../../../../../[ファイル名].cpp
(gdb) n
ブレークポイント 1、[関数名] (ostr=...、clientResponse=...、httpProtocol=...、>closeConn=...、asynchResponse=...、reqType=...)
at ../../../../../[ファイル名].cpp:167
167 in ../../../../../[ファイル名].cpp
(gdb) n
警告:
ブレークポイント 0 を挿入できません
。メモリ アドレス 0x36cc6dde へのアクセス中にエラーが発生しました: 入出力エラー。
/lib/libc.so.6
(gdb)からの siglongjmp () の 0xf7082771
これは からの出力です/proc/[PID]/maps
:
08048000-08146000 R-XP 00000000 08:03 293876
08146000-08150000 RW-P 000FE000 08:03 293876 08150000-099C8000 RW
-P 081500000000: 00 C29FA000 RWXP C21FA000 00:00 0 C29FA000-C29FB000 --- P C29FA000 00:00 0 ……<BR> F1E1B000-F1E24000 RW-P F1E1B000 000 00:00 0 F1E24000 - F2093000 R-XP 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030003 F2094000 --- P 0026F000 08:03 295549 .SO F2094000-F2098000 R-P 0026F000 08:03 295549 .SO F2098000-F209C000 RW-P 00273000 08:03 295549 .SO F209C000-F209D000 P209C 000P209C 000P209C000:00C
私の質問は次のとおりです。
Gdb はコマンドの内部ブレークポイントの挿入に失敗しますが、テキスト セクションが にある場合に
ni
アドレスにアクセスしようとするのはなぜですか?ご覧のとおり、そのアドレスはマップの出力に含まれていません。0x36cc6dde
0xf1******
より一般的な質問ですが、共有ライブラリは から始まると言われまし
0x40000000
たが、なぜ私の環境ではそうではないのでしょうか?
共有ライブラリは でコンパイルされ-fPIC
ます。上記のトレースでは、いくつかのシンボル名を隠しています。