2009-09-17 53 views
14

Estoy tratando de establecer un punto de interrupción en Linux en gdb para un programa de creación de hilos. Me gustaría establecer un punto de interrupción en la creación de subprocesos, pero desafortunadamente pthread_create es un símbolo versionado, y no puedo obtener su nombre completo.gdb punto de interrupción en pthread_create

si escribo:

catch thread_start 

me sale

Catch of thread_start not yet implemented 

¿Cómo es la mejor manera de coger la creación del hilo en el BGF para esta situación?

Respuesta

15

Prueba esto:

(gdb) b __pthread_create_2_1 

o construir su propia GDB con this patch aplicada.

O probar la última versión preliminar GDBhere, lo que debería permitir hacer "catch syscall clone"

2

OK, voy a publicar dos respuestas, porque no estoy seguro si entiendo su pregunta.

Primero: pthread_create está en una biblioteca compartida, y gdb sabe cómo manejarlo. Si solo dice "romper pthread_create", debería "simplemente funcionar".

No debería ser necesario para saber esto, pero la forma en que debería funcionar es que el BGF encontrará un símbolo "@ pthread_create PLT", que es un código auxiliar que conduce a el cargador dinámico, y con el tiempo será reemplazado mediante un salto a la función de biblioteca compartida apropiada . Estableceremos un punto de interrupción allí, y gdb se ocupará automáticamente del cargador dinámico hasta que eventualmente alcance (y se detenga en) la función de biblioteca compartida correcta.

Ahora bien, en caso de que no lo resuelve para usted, en mi segunda respuesta ...

15

OK, así que en caso de que realmente no entiendo, o mi primera respuesta no ha sido útil, haz esto:

(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 

Ahora escoge el símbolo que crees que es el correcto, y establece un punto de quiebre allí. No elija los que tienen "@" en ellos, pero uno de los que tiene dígitos y caracteres de subrayado, como 1__pthread_create_2_1.

Cuestiones relacionadas