2009-09-17 5 views
14

J'essaie de définir un point d'arrêt dans Linux dans gdb pour un programme créant des threads. Je voudrais placer un point d'arrêt sur la création de fil, mais malheureusement pthread_create est un symbole versionné, et je ne peux pas obtenir son nom complet.gdb breakpoint sur pthread_create

Si je tape:

catch thread_start 

Je reçois

Catch of thread_start not yet implemented 

Comment est la meilleure façon d'attraper la création de fil dans gdb pour cette situation?

Répondre

15

Essayez ceci:

(gdb) b __pthread_create_2_1 

Ou construire votre propre GDB avec this patch appliqué.

Ou essayez la dernière préversion GDBhere, qui devrait vous permettre de faire "catch syscall clone"

2

OK, je vais poster deux réponses, parce que je ne suis pas sûr si je comprends bien votre question.

Premièrement: pthread_create est dans une bibliothèque partagée, et gdb sait comment gérer cela. Si vous dites simplement "break pthread_create", cela devrait "juste marcher".

Vous ne devriez pas besoin de le savoir, mais la façon dont il devrait fonctionner est que gdb trouverez un symbole « @ pthread_create plt », qui est un bout qui mène à le chargeur dynamique, et sera finalement remplacé par un saut à la fonction de bibliothèque partagée appropriée . Nous allons définir un point d'arrêt là, et gdb traitera automatiquement avec le chargeur dynamique jusqu'à ce que finalement atteigne (et s'arrête à) la fonction de bibliothèque partagée correcte.

Maintenant, dans le cas où cela ne résout pas pour vous, à ma deuxième réponse ...

15

OK, au cas où je ne comprenais pas vraiment, ou ma première réponse m'a pas été utile, faire:

(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 

Choisissez maintenant le symbole que vous pensez est la bonne, et définir un point de jonction. Ne choisissez pas ceux qui ont "@" dans eux, mais l'un de ceux qui a des chiffres et des traits de soulignement, tels que 1__pthread_create_2_1.

Questions connexes