2009-08-30 15 views
32
  1. Si establezco un punto de observación para una variable local en el ámbito actual, se eliminará automáticamente cuando salga del alcance. ¿Hay alguna manera de establecerlo una vez y mantenerlo vivo automáticamente cada vez que ingrese el mismo alcance?¿Cómo configuro los puntos de observación persistentes y condicionales en variables de ámbito local?

  2. ¿Hay alguna forma de establecer un punto de observación condicional, como watch var1 if var1==0? En mi caso, la condición no funciona. gdb se detiene cada vez que se cambia el valor var1, en lugar de hasta var1 == 0 es verdadero. Mi gdb es GNU gdb 6.8-debian.

Respuesta

3
  1. no estoy seguro de que el lenguaje nos estamos utilizando, por lo que la respuesta exacta variará, pero podrías cambiar la variable a ser estáticos, global, o dinámicamente asignada (y no lo hacen gratis cuando la función regresa?). De esta forma, su dirección sin formato no cambiará, y gdb podrá tener un punto de interrupción en ella.

  2. En lugar de ver el valor cuando es igual a un valor específico; debe establecer un punto de interrupción condicional en la línea donde desea verificar el valor de var1. Esto debería tener efectivamente el mismo efecto

e.g.

(gdb) break main.c:123 if (var1 == 0) 
+0

Estoy usando C++. Uso el punto de observación sobre punto de corte porque podría haber muchos lugares en el código que cambian el valor de la variable. Por lo tanto, no es realista agregar puntos de corte a cada lugar. Me gustaría ver si es posible establecer un punto de observación condicional. – Tim

29

Estoy de acuerdo con Dave en que un punto de interrupción condicional es el camino a seguir.

Sin embargo, para hacer lo que pidió, puede usar el comando commands de GDB para establecer una lista de comandos GDB para ejecutar cada vez que se golpea un punto de interrupción. Encuentro esto increíblemente útil.

Te sugiero que escribas tus comandos GDB en un archivo para que sean fáciles de editar y fáciles de recargar con el comando source. O puede especificar archivos de comando para cargar en la línea de comando de GDB o usar .gdbinit para que se carguen automáticamente.

Un ejemplo de un buen uso de commands:
Supongamos que tengo una función format que es llamado por una gran cantidad de otras funciones. Quiero romperlo, pero solo después de haber llamado a la función do_step_3.

break do_step_3 
commands 
    break format 
    continue 
end 

Usted podría utilizar esto para su problema con algo como:

break func 
commands 
    watch var 
    continue 
end 
+0

¡Excelentes puntos! ¡Gracias! – Tim

12

Puede establecer las condiciones en los puntos de observación de la misma manera que lo hace con los puntos de interrupción. Esto es in the documentation pero es cierto que apenas llama la atención sobre sí mismo.

Así que watch my_var if my_var > 3 funciona bien, al igual que el comando condition.

Para recrear el punto de observación si la variable que está viendo está fuera del alcance, haga que gdb haga esto automáticamente utilizando un punto de interrupción al comienzo de la función como describió Zan.

8

Puede establecer un punto de observación que no se salga de alcance al configurarlo en la dirección de memoria.

(gdb) p &var1 
$1 = (int *) 0x41523c0 
(gdb) watch *(int *)0x41523c0 
Hardware watchpoint 1: *(int *)0x41523c0 

Esto también funciona para otros tipos de datos y punteros.

+6

Esto puede ser útil, pero no funcionará aquí. Las variables locales no mantendrán la misma dirección entre las llamadas a funciones, pero es probable que otras variables apiladas usen esa ubicación de memoria ... – Nick

Cuestiones relacionadas