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

StackOverflow https://stackoverflow.com/questions/4183871

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?

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top