Точка останова gdb на pthread_create

Я пытаюсь установить точку останова в linux в gdb для программы, создающей потоки. Я хотел бы установить точку останова при создании потока, но, к сожалению, pthread_create является версированным символом, и я не могу получить его полное имя.

Если я напечатаю:

catch thread_start

Я получаю

Catch of thread_start not yet implemented

Как наилучший способ поймать создание потоков в gdb для этой ситуации?

Ответы

Ответ 1

Попробуйте следующее:

(gdb) b __pthread_create_2_1

Или создайте свой собственный GDB с помощью этот патч.

Или попробуйте последнюю предварительную версию GDB здесь, которая должна позволить вам сделать "catch syscall clone"

Ответ 2

Хорошо, так что, если бы я вас не понял, или мой первый ответ не помог, сделайте следующее:

(gdb) info func pthread_create
All functions matching regular expression "pthread_create":

Non-debugging symbols:
0x080485e0  pthread_create
0x080485e0  [email protected]
0x00786590  __pthread_create_2_1
0x00786590  [email protected]@GLIBC_2.1
0x00786ee0  __pthread_create_2_0
0x00786ee0  [email protected]_2.0

Теперь выберите символ, который, по вашему мнению, правильный, и установите там точку останова. Не выбирайте те, у которых в них есть "@", но один из них с цифрами и подчеркивания, такие как 1__pthread_create_2_1.

Ответ 3

Хорошо, я отправлю два ответа, потому что не уверен, понимаю ли я ваш вопрос.

Сначала: pthread_create находится в общей библиотеке, и gdb знает, как с этим справиться. Если вы просто скажете "break pthread_create", он должен "просто работать".

Вам не нужно знать это, но способ, которым он должен работать, - это gdb найдет символ "pthread_create @plt", который является заглушкой, которая ведет в динамический загрузчик, и в конечном итоге будет заменен прыжком на соответствующей общей библиотечной функции. Мы установим там точку останова, и gdb будет автоматически обрабатывать динамический загрузчик, пока достигая (и останавливаясь) правильной общей библиотечной функции.

Теперь, если это не решит его для вас, на мой второй ответ...