Ответ 1
Попробуйте следующее:
(gdb) b __pthread_create_2_1
Или создайте свой собственный GDB
с помощью этот патч.
Или попробуйте последнюю предварительную версию GDB
здесь, которая должна позволить вам сделать "catch syscall clone"
Я пытаюсь установить точку останова в linux в gdb для программы, создающей потоки. Я хотел бы установить точку останова при создании потока, но, к сожалению, pthread_create
является версированным символом, и я не могу получить его полное имя.
Если я напечатаю:
catch thread_start
Я получаю
Catch of thread_start not yet implemented
Как наилучший способ поймать создание потоков в gdb для этой ситуации?
Попробуйте следующее:
(gdb) b __pthread_create_2_1
Или создайте свой собственный GDB
с помощью этот патч.
Или попробуйте последнюю предварительную версию GDB
здесь, которая должна позволить вам сделать "catch syscall clone"
Хорошо, так что, если бы я вас не понял, или мой первый ответ не помог, сделайте следующее:
(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.
Хорошо, я отправлю два ответа, потому что не уверен, понимаю ли я ваш вопрос.
Сначала: pthread_create находится в общей библиотеке, и gdb знает, как с этим справиться. Если вы просто скажете "break pthread_create", он должен "просто работать".
Вам не нужно знать это, но способ, которым он должен работать, - это gdb найдет символ "pthread_create @plt", который является заглушкой, которая ведет в динамический загрузчик, и в конечном итоге будет заменен прыжком на соответствующей общей библиотечной функции. Мы установим там точку останова, и gdb будет автоматически обрабатывать динамический загрузчик, пока достигая (и останавливаясь) правильной общей библиотечной функции.
Теперь, если это не решит его для вас, на мой второй ответ...