2009-01-24 9 views
17

y me gustaría saber si hay alguna manera de detener un programa cuando está usando una función de un determinado archivo. Lo ideal sería que lo que yo estoy buscando es algo así como:Usando gdb, detenga el programa cuando esté usando cualquier función del archivo X

GDB Stop when use a function from file foo.cpp 

La razón para hacer esto es porque estoy depurando un código que no es mío y no sé exactamente lo que se ha denominado funciones y qué funciones no están. ¿Hay alguna función en GDB para hacer lo que estoy buscando, o alguna otra forma recomendada de hacer algo similar ?.

Gracias

+0

Acepte: http://stackoverflow.com/a/478145/895245, hace exactamente lo que quiere en el GDB actual. –

Respuesta

21

Paso 1: construir una lista de todas las funciones definidas en foo.cpp
La forma más simple que puedo pensar (suponiendo que tiene binutils y GNU grep):

nm a.out | grep ' T ' | addr2line -fe a.out | 
    grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist 

Paso 2: la construcción de una secuencia de comandos de GDB, que establecerá un punto de interrupción en cada uno de las funciones anteriores:

sed 's/^/break /' funclist > stop-in-foo.gdb 

[Obviamente, los pasos 1 y 2 podrían combinarse; -]

Paso 3: en realidad los puntos de corte establecidos:

gdb a.out 
(gdb) source stop-in-foo.gdb 

En cuanto a this respuesta, de una manera aún más simple (si está en Fedora Linux) para saber qué funciones foo.cpp se llaman:

ftrace -sym='foo.cpp#*' ./a.out 

Lástima ftrace página de manual dice que esto aún no está implementado.

+0

Iba a decir que hiciera esto, pero +1 por hacerlo. =) –

+1

Parece que no recoge las funciones estáticas. –

0

puntos de interrupción del BGF tiene un par de sintaxis ... See here.

No va a romper en cualquier función en el archivo, aunque ....

Editar: Se podría hacer algo estúpido como hacer que todas las funciones llamen a una función ficticia void foo (void), y punto de interrupción dentro. Al menos se rompería dentro del archivo y sería trivial encontrar qué función del lado del archivo X se está llamando.

+0

No es una mala idea la función foo, la cosa es que tengo muchos métodos y archivos, la única opción que quizás puedo usar es rbreak regex. Gracias – Eduardo

2

Empleado respuesta de Rusia se ve muy bien, pero como usted dice:

no sé exactamente qué funciones están sido llamado y qué funciones son no.

¿Sería un informe de los cuales se ven afectados funciones, generado por una herramienta de cobertura de código como gcov o algo relacionado con Valgrind ser una buena solución a su problema?

1

Puede utilizar el comando:

break foo.cpp:function-name 
+0

Esto solo se dividirá en una función, pero la pregunta es para todas las funciones. – Herbert

+0

'rbreak foo.cpp: .' se dividirá en todas las funciones de' foo.cpp' que coincidan con regex '.' (es decir, todas las funciones de' foo.cpp'). – ShreevatsaR

10

rbreak regex

Establecer puntos de interrupción en todas las funciones de expresiones regulares que concuerden con la expresión regular.Este comando establece un punto de interrupción incondicional en todas las coincidencias, imprimiendo una lista de todos los puntos de interrupción que estableció. Una vez que se establecen estos puntos de interrupción, se tratan como los puntos de interrupción establecidos con el comando de interrupción. Puede eliminarlos, deshabilitarlos o hacerlos condicional del mismo modo que cualquier otro punto de interrupción.

La sintaxis de la expresión regular es la estándar utilizada con herramientas como `grep '. Tenga en cuenta que esto es diferente de la sintaxis utilizada por shells, por lo que foo * coincide con todas las funciones que incluyen un fo seguido de cero o más os. Hay una implícita. * Que encabeza y sigue la expresión regular que usted suministra, por lo que para hacer coincidir solo las funciones que comienzan con foo, use^foo.

Al depurar programas C++, rbreak es útil para establecer puntos de interrupción en funciones sobrecargadas que no son miembros de ninguna clase especial.

+1

Esto parece ser mejor que la respuesta aceptada para mí :) – kizzx2

+0

¡Esto me ayudó enormemente! Aunque supongo que no puede ser la respuesta aceptada ya que coincide con los nombres de las funciones y no con el nombre del archivo en el que reside. –

1

rbreak foo.cpp:.

Aquí . concuerda con algo, y así se rompe en todas las funciones de archivo foo.cpp.

Cuestiones relacionadas