スレッドを作成するプログラムの gdb で Linux にブレークポイントを設定しようとしています。スレッドの作成にブレークポイントを設定したいのですが、残念ながらpthread_create
バージョン管理されたシンボルであり、完全な名前を取得できません。
私が入力した場合:
catch thread_start
私は得る
Catch of thread_start not yet implemented
この状況でgdbでスレッドの作成をキャッチする最良の方法は?
スレッドを作成するプログラムの gdb で Linux にブレークポイントを設定しようとしています。スレッドの作成にブレークポイントを設定したいのですが、残念ながらpthread_create
バージョン管理されたシンボルであり、完全な名前を取得できません。
私が入力した場合:
catch thread_start
私は得る
Catch of thread_start not yet implemented
この状況でgdbでスレッドの作成をキャッチする最良の方法は?
わかりませんでした、または最初の回答が役に立たなかった場合は、次のようにします。
(gdb) info func pthread_create
All functions matching regular expression "pthread_create":
Non-debugging symbols:
0x080485e0 pthread_create
0x080485e0 pthread_create@plt
0x00786590 __pthread_create_2_1
0x00786590 pthread_create@@GLIBC_2.1
0x00786ee0 __pthread_create_2_0
0x00786ee0 pthread_create@GLIBC_2.0
正しいと思われるシンボルを選択し、そこにブレークポイントを設定します。「@」が含まれているものは選択しないでください。1__pthread_create_2_1 など、数字とアンダースコアが含まれているものを選択してください。
これを試して:
(gdb) b __pthread_create_2_1
または、このパッチを適用GDB
して独自のビルドを作成してください。
GDB
または、ここで最新のプレリリースを試してください。"catch syscall clone"
OK、あなたの質問を理解しているかどうかわからないので、2 つの回答を投稿します。
まず、pthread_create は共有ライブラリにあり、gdb はそれを処理する方法を知っています。「pthread_create を壊す」と言うだけで、「うまくいく」はずです。
これを知る必要はありませんが、gdb がシンボル "pthread_create@plt" を見つけて、ダイナミック ローダーにつながるスタブになり、最終的に適切な場所へのジャンプに置き換えられるようにする必要があります。共有ライブラリ機能。そこにブレークポイントを設定すると、最終的に正しい共有ライブラリ関数に到達 (および停止) するまで、gdb は動的ローダーを自動的に処理します。
それでも解決しない場合は、2番目の回答に進みます...