¿Cómo configuro un punto de corte condicional en gdb, cuando char*x apunta a una cadena cuyo valor es igual a "hola"?
debugging conditional-breakpoint (3)
¿Puedo especificar que quiero que gdb se rompa en la línea x cuando char* x
apunta a una cadena cuyo valor es igual a "hello"
? Si es así, ¿cómo?
Puedes usar strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
es el número de línea, x
puede ser cualquier nombre de archivo e y
puede ser cualquier variable.
Desde GDB 7.5 puede usar estas prácticas funciones de conveniencia :
$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)
Parece bastante menos problemático que tener que ejecutar un strcmp()
"extraño" strcmp()
en la pila del proceso cada vez que se golpea el punto de interrupción.
Tenga en cuenta que su GDB debe compilarse con soporte de Python, lo cual no es un problema con las distribuciones de Linux actuales. Para estar seguro, puedes verificarlo ejecutando la
show configuration
dentro de GDB y buscando--with-python
. Este pequeño oneliner también hace el truco:
$ gdb -n -quiet -batch -ex ''show configuration'' | grep ''with-python'' --with-python=/usr (relocatable)
Para su caso de demostración, el uso sería
break <where> if $_streq(x, "hello")
o, si su punto de interrupción ya existe y solo desea agregar la condición a él
condition <breakpoint number> $_streq(x, "hello")
$_streq
solo coincide con toda la cadena, por lo que si desea algo más astuto, debe usar $_regex
, que admite la sintaxis de expresión regular de Python .
break x if ((int)strcmp(y, "hello")) == 0
En algunas implementaciones, gdb podría no conocer el tipo de retorno de strcmp. Eso significa que tendrías que lanzar, de lo contrario siempre se evaluaría como verdadero.