A veces tengo que rastrear muchas llamadas a funciones, incluso para bibliotecas externas que no tengo ningún control, o no quiero modificar.
Hace algún tiempo, me di cuenta de que puedes combinar los puntos de interrupción de expresión regular de gdb (los normales también están bien) y luego ejecutar un conjunto de comandos cada vez que se activan esos puntos de interrupción. Ver: http://www.ofb.net/gnu/gdb/gdb_35.html
Por ejemplo, si desea realizar un seguimiento de todas las funciones que comienzan con "MPI_" prefijo, que puede hacer:
(gdb) rbreak MPI_
[...]
(gdb) command 1-XX
(gdb) silent
(gdb) bt 1
(gdb) echo \n\n
(gdb) continue
(gdb) end
orden silenciosa se utiliza para ocultar los mensajes de GDB Cuando se encuentra un punto de interrupción . Normalmente imprimo un par de líneas vacías, para que sea más fácil de leer.
Entonces, simplemente ejecutar el programa: (BGF) corren
Una vez que el programa comienza a funcionar, el BGF imprimirá las más altas de N niveles backtrace.
#0 0x000000000040dc60 in [email protected]()
#0 PMPI_Initialized (flag=0x7fffffffba78) at ../../src/mpi/init/initialized.c:46
#0 0x000000000040d9b0 in [email protected]()
#0 PMPI_Init_thread (argc=0x7fffffffbe78, argv=0x7fffffffbde0, required=3, provided=0x7fffffffba74) at ../../src/mpi/init/initthread.c:946
#0 0x000000000040e390 in [email protected]()
#0 PMPI_Comm_rank (comm=1140850688, rank=0x7fffffffba7c) at ../../src/mpi/comm/comm_rank.c:53
#0 0x000000000040e050 in [email protected]()
#0 PMPI_Type_create_struct (count=3, array_of_blocklengths=0x7fffffffba90, array_of_displacements=0x7fffffffbab0, array_of_types=0x7fffffffba80, newtype=0x69de20) at ../../src/mpi/datatype/type_create_struct.c:116
#0 0x000000000040e2a0 in [email protected]()
#0 PMPI_Type_commit (datatype=0x69de20) at ../../src/mpi/datatype/type_commit.c:75
Si desea información más detallada, la impresión de las variables locales de un punto de interrupción dada es también posible, basta con insertar más comandos entre command
y end
.
Consejo adicional: agregue todos estos a su archivo .gdbinit
y canalice la ejecución en un archivo.
Utilice un depurador. O invoque alguna forma de registro fprintf en un archivo. Pero tal vez las últimas opciones no serían buenas ya que no desea modificar el código fuente. – Lefteris
¿Tal vez un generador de perfiles para obtener un gráfico de llamadas? –
¿Estás buscando algo así? http://stackoverflow.com/questions/311840/tool-to-trace-local-function-calls-in-linux – delannoyk