gdb watchpoint

gdb - ¿Cómo configuro los puntos de observación persistentes y condicionales en variables de ámbito local?



watchpoint (4)

  1. Si configuro 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?

  2. ¿Hay alguna forma de establecer un punto de watch var1 if var1==0 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 de var1 == 0 , en lugar de hasta var1 == 0 es verdadero. Mi gdb es GNU gdb 6.8-debian.


  1. No estoy seguro de qué idioma usamos, por lo que la respuesta exacta variará, pero ¿podría cambiar la variable para que sea estática, global o dinámicamente asignada (y no la libere cuando la función vuelva a aparecer?). 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 mirar 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

p.ej

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


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

Sin embargo, para hacer lo que usted pidió, puede usar el commands de 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.

Sugiero que escribas tus comandos GDB en un archivo para que sean fáciles de editar y fáciles de recargar con el comando de 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 los commands :
Supongamos que tengo un format función llamado por muchas otras funciones. Quiero romperlo, pero solo después de la función do_step_3 ha sido llamado.

break do_step_3 commands break format continue end

Puede usar esto para su problema con algo como:

break func commands watch var continue end


Puede establecer condiciones en los puntos de observación de la misma manera que lo hace con los puntos de interrupción. Esto está en la documentación, 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 de condition .

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


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.