17

スレッドを作成するプログラムの gdb で Linux にブレークポイントを設定しようとしています。スレッドの作成にブレークポイントを設定したいのですが、残念ながらpthread_createバージョン管理されたシンボルであり、完全な名前を取得できません。

私が入力した場合:

catch thread_start

私は得る

Catch of thread_start not yet implemented

この状況でgdbでスレッドの作成をキャッチする最良の方法は?

4

3 に答える 3

19

わかりませんでした、または最初の回答が役に立たなかった場合は、次のようにします。

(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 など、数字とアンダースコアが含まれているものを選択してください。

于 2009-10-09T19:09:36.660 に答える
18

これを試して:

(gdb) b __pthread_create_2_1

または、このパッチを適用GDBして独自のビルドを作成してください。

GDB または、ここで最新のプレリリースを試してください。"catch syscall clone"

于 2009-09-18T14:16:31.113 に答える
3

OK、あなたの質問を理解しているかどうかわからないので、2 つの回答を投稿します。

まず、pthread_create は共有ライブラリにあり、gdb はそれを処理する方法を知っています。「pthread_create を壊す」と言うだけで、「うまくいく」はずです。

これを知る必要はありませんが、gdb がシンボル "pthread_create@plt" を見つけて、ダイナミック ローダーにつながるスタブになり、最終的に適切な場所へのジャンプに置き換えられるようにする必要があります。共有ライブラリ機能。そこにブレークポイントを設定すると、最終的に正しい共有ライブラリ関数に到達 (および停止) するまで、gdb は動的ローダーを自動的に処理します。

それでも解決しない場合は、2番目の回答に進みます...

于 2009-10-09T19:06:32.923 に答える