poner - Usando gdb, detenga el programa cuando esté usando cualquier función del archivo X.
poner etiquetas a carpetas en windows (6)
Los puntos de interrupción de gdb tienen un par de sintaxis ... Ver aquí.
Sin embargo, no romperá ninguna función en el archivo ...
Editar: Podrías hacer algo estúpido como hacer que todas las funciones llamen a una función ficticia void foo (void), y un 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.
y me gustaría saber si hay alguna manera de detener un programa cuando está usando una función de un determinado archivo. Idealmente, lo que estoy buscando es algo así como:
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 qué funciones se han llamado y qué funciones no son. ¿Hay alguna función en GDB para hacer lo que estoy buscando, o alguna otra forma recomendada de hacer algo similar ?.
Gracias
La respuesta del ruso empleado parece muy buena, pero ya que dices:
No sé exactamente qué funciones se han llamado y qué funciones no son.
¿Sería una buena solución a su problema un informe de qué funciones son afectadas, generadas por una herramienta de cobertura de código como gcov o algo relacionado con Valgrind ?
rbreak regex
Establezca puntos de interrupción en todas las funciones que coincidan con la expresión regular 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.
Puedes usar el comando:
break foo.cpp:function-name
Paso 1: foo.cpp
una lista de todas las funciones definidas en foo.cpp
La forma más simple en que puedo pensar (suponiendo que tienes binutils
y GNU grep
):
nm a.out | grep '' T '' | addr2line -fe a.out |
grep -B1 ''foo/.cpp'' | grep -v ''foo/.cpp'' > funclist
Paso 2: construye un script GDB que establecerá un punto de corte en cada una 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 establecer los puntos de corte:
gdb a.out
(gdb) source stop-in-foo.gdb
En cuanto a esta respuesta, una forma aún más simple (si está en Fedora Linux) para saber qué funciones de foo.cpp se llaman:
ftrace -sym=''foo.cpp#*'' ./a.out
Una mala página de Ftrace Man dice que esto aún no está implementado.
rbreak foo.cpp:.
Aquí .
coincide con cualquier cosa, por lo que se rompe en todas las funciones del archivo foo.cpp
.