2009-09-17 10 views
14

Próbuję ustawić punkt przerwania w Linuksie w gdb dla programu tworzącego wątki. Chciałbym ustawić punkt przerwania w tworzeniu wątków, ale niestety pthread_create jest wersjonowanym symbolem i nie mogę uzyskać jego pełnej nazwy.Punkt przerwania gdb na pthread_create

Gdybym wpisać:

catch thread_start 

uzyskać

Catch of thread_start not yet implemented 

jaki jest najlepszy sposób, aby złapać tworzenia wątków w gdb dla tej sytuacji?

Odpowiedz

15

Spróbuj tego:

(gdb) b __pthread_create_2_1 

Albo zbudować własny GDB z this patch stosowane.

Albo spróbować ostatni pre-release GDBhere, co powinno pozwolić Ci zrobić "catch syscall clone"

2

OK, mam zamiar pisać dwie odpowiedzi, ponieważ nie jestem pewien, czy rozumiem pytanie.

Po pierwsze: pthread_create znajduje się we wspólnej bibliotece, a gdb wie, jak sobie z tym poradzić. Jeśli po prostu powiesz "break pthread_create", powinno "po prostu zadziałać".

Nie należy wiedzieć, ale tak powinno działać to, że gdb znajdzie się symbol „@ pthread_create PLT”, który jest szkieletem, który prowadzi do ładowarka dynamiczny i zostaną ostatecznie zastąpione poprzez przeskok do odpowiedniej funkcji biblioteki współdzielonej. Ustawimy tam punkt przerwania, , a gdb automatycznie zajmie się dynamicznym ładowaniem do momentu, aż osiągnie (i zatrzyma się na) poprawną funkcję biblioteki współdzielonej.

Teraz w przypadku, że nie rozwiązuje to dla ciebie, na moim drugim odpowiedzi ...

15

OK, więc w przypadku I naprawdę nie rozumiem, albo moja pierwsza odpowiedź nie okazała się pomocna, zrób to:

(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 

Teraz wybierz symbol, który uważasz za właściwy i ustaw tam punkt przerwania. Nie wybieraj tych, które mają w sobie znak "@", ale jeden z cyfr o cyfrach i podkreśleń, takich jak 1__pthread_create_2_1.