Respuestas:
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 y y
cualquier variable.
No symbol "strcmp" in current context.
run
para que las bibliotecas dinámicas se carguen. Para la fuente, búscalo en google y encuentra: stackoverflow.com/questions/10000335/… :-)
$_streq
El método de @tlwhitec es mejor.
break x if ((int)strcmp(y, "hello")) == 0
En algunas implementaciones, es posible que gdb no conozca el tipo de retorno de strcmp. Eso significa que tendrías que lanzar, de lo contrario, siempre se evaluaría como verdadero.
Desde GDB 7.5 puede usar estas funciones de conveniencia nativas :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
Parece bastante menos problemático que tener que ejecutar un "extraño" strcmp()
en la pila del proceso cada vez que se alcanza el punto de interrupción. Esto es especialmente cierto para la depuración de procesos multiproceso.
Tenga en cuenta que su GDB debe compilarse con el soporte de Python, que no es un problema con las distribuciones actuales de Linux. Para estar seguro, puede verificarlo ejecutando
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 agregarle la condición
condition <breakpoint number> $_streq(x, "hello")
$_streq
solo coincide con la cadena completa, por lo que si desea algo más astuto debe usarlo $_regex
, que admite la sintaxis de expresión regular de Python .
strncmp
ystrstr
son otras funciones útiles de consulta en C.