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

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

Если я наберу:

catch thread_start

я получил

Catch of thread_start not yet implemented

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


person Juan    schedule 17.09.2009    source источник


Ответы (3)


Попробуй это:

(gdb) b __pthread_createGDB1

Или создайте свой собственный GDB с применением этого исправления.

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

person Employed Russian    schedule 18.09.2009

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

(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.

person Michael Snyder    schedule 09.10.2009

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

Во-первых: pthread_create находится в разделяемой библиотеке, и gdb знает, как с этим справиться. Если вы просто скажете «сломать pthread_create», это должно «просто сработать».

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

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

person Michael Snyder    schedule 09.10.2009