¿Cómo configuro un punto de interrupción condicional en gdb, cuando char * x apunta a una cadena cuyo valor es igual a "hola"?

164

¿Puedo especificar que quiero que gdb se rompa en la línea x cuando char* xapunta a una cadena cuyo valor es igual "hello"? Si es así, ¿cómo?

341008
fuente
Nota: strncmpy strstrson otras funciones útiles de consulta en C.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

198

Puedes usar strcmp:

break x:20 if strcmp(y, "hello") == 0

20es el número de línea, xpuede ser cualquier nombre de archivo y ycualquier variable.

Nathan Fellman
fuente
9
Nota: ya debe estar ejecutando el programa para que GDB vea el stdlib. De lo contrario:No symbol "strcmp" in current context.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 六四 事件 法轮功 包 卓 轩: ¿Cómo configurar gdb para ver el stdlib?
ingenuo231
@ naive231 por "ver" Me refería a ver las funciones para que pueda romperlas, no la fuente: debe presionar runpara que las bibliotecas dinámicas se carguen. Para la fuente, búscalo en google y encuentra: stackoverflow.com/questions/10000335/… :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Este método puede tener efectos secundarios. $_streqEl método de @tlwhitec es mejor.
Rools
55
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.

Tobias Domhan
fuente
46

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 configurationdentro 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")

$_streqsolo 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 .

tlwhitec
fuente