2010-11-15 8 views

Respuesta

153

Puede utilizar strcmp:

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

20 es el número de línea, x puede haber ningún nombre de archivo y y puede ser cualquier variable.

+6

Nota: debe ejecutar el programa ya para que GDB vea el archivo stdlib. De lo contrario: 'Sin símbolo" strcmp "en el contexto actual. –

+0

@ naive231 por "ver" Quise decir ver las funciones para que pueda romperlas, no la fuente: tiene que presionar 'ejecutar' para que las bibliotecas dinámicas se carguen. Para la fuente, googleela y encuentre: http://stackoverflow.com/questions/10000335/how-to-use-debug-version-of-libc :-) –

39
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.

10

Since GDB 7.5 puede utilizar éstos prácticos Convenience Functions:

$_memeq(buf1, buf2, length)` 
$_streq(str1, str2) 
$_strlen(str) 
$_regex(str, regex) 

parece bastante menos problemática de tener que ejecutar un "extraño" strcmp() en el proceso de apilar cada vez que el punto de ruptura es golpeado.

Tenga en cuenta que su GDB debe compilarse con compatibilidad con Python, lo que no es un problema con las distribuciones de Linux actuales. Para estar seguro, puede verificarlo 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 lo que desea añadir el condición de que

condition <breakpoint number> $_streq(x, "hello") 

$_streq sólo coincide con todo el str Por lo tanto, si desea algo más astuto, debe usar $_regex, que admite Python regular expression syntax.

Cuestiones relacionadas