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


¿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?

Author: 341008, 2010-11-15

3 answers

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 puede ser cualquier variable.

 172
Author: Nathan Fellman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 08:56:22
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ía que lanzar, de lo contrario siempre evaluaría a verdadero!

 42
Author: Tobias Domhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 08:57:22

Desde GDB 7.5 puede utilizar 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 "extranjero" strcmp() en la pila del proceso cada vez que se alcanza el punto de interrupción.

Tenga en cuenta que su GDB debe compilarse con soporte Python, lo cual no es un problema con las distribuciones de linux actuales. Para estar seguro, puede comprobarlo ejecutando show configuration dentro de GDB y buscando --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)

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

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 expresiones regulares de Python.

 22
Author: tlwhitec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-10 12:46:33