¿Cómo se configura un punto de interrupción condicional en GDB, cuando char * x apunta a una cadena cuyo valor es igual a “hola”?
-
10-10-2019 - |
Pregunta
¿Puedo especificar que quiero GDB para romper en la línea x cuando char* x
puntos a una cadena cuyo valor es igual a "hello"
? En caso afirmativo, ¿cómo?
Solución
Se puede utilizar strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
es el número de línea, x
puede ser cualquier nombre de archivo y y
puede ser cualquier variable.
Otros consejos
break x if ((int)strcmp(y, "hello")) == 0
En algunas implementaciones GDB puede no saber el tipo de retorno de strcmp. Eso significa que tendría que fundido, de lo contrario, siempre se evaluarían a cierto!
Desde GDB 7.5 puede utilizar éstos a la mano Funciones de Conveniencia :
$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)
Parece bastante menos problemática de tener que ejecutar un strcmp()
"extranjera" en el proceso de apilar cada vez que el punto de ruptura es exitosa.
Tenga en cuenta sus necesidades GDB a ser compilado con soporte para Python, que no es un problema con las distribuciones de Linux actuales. Para estar seguros, se puede comprobar mediante la ejecución de
show configuration
dentro del BGF y la búsqueda de--with-python
. Este pequeño oneliner hace el truco, también:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
En su caso demostración, el uso sería
break <where> if $_streq(x, "hello")
o, si su punto de interrupción ya existe y lo que desea añadir la condición de que
condition <breakpoint number> $_streq(x, "hello")
$_streq
sólo coincide con la cadena entera, así que si quieres algo más astuto que puedes usar $_regex
, que apoya la Python expresión regular sintaxis .