Respostas:
Você pode usar strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
é o número da linha, x
pode ser qualquer nome de arquivo e y
qualquer variável.
No symbol "strcmp" in current context.
run
por isso para que as bibliotecas dinâmicas sejam carregadas. Para fonte, google-lo e encontrar: stackoverflow.com/questions/10000335/... :-)
$_streq
O método @tlwhitec é melhor.
break x if ((int)strcmp(y, "hello")) == 0
Em algumas implementações, o gdb pode não saber o tipo de retorno do strcmp. Isso significa que você teria que lançar, caso contrário, sempre seria avaliado como verdadeiro!
Desde o GDB 7.5, você pode usar estas Funções de Conveniência nativas :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
Parece bem menos problemático do que ter que executar um "estrangeiro" strcmp()
na pilha do processo cada vez que o ponto de interrupção é atingido. Isso é especialmente verdadeiro para depurar processos multithread.
Observe que seu GDB precisa ser compilado com o suporte ao Python, o que não é um problema nas distribuições linux atuais. Para ter certeza, você pode verificá-lo executando o
show configuration
GDB e pesquisando--with-python
. Este pequeno oneliner também faz o truque:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
Para o seu caso de demonstração, o uso seria
break <where> if $_streq(x, "hello")
ou, se seu ponto de interrupção já existir e você quiser adicionar a condição a ele
condition <breakpoint number> $_streq(x, "hello")
$_streq
corresponde apenas a toda a cadeia; portanto, se você quiser algo mais astuto $_regex
, use , que suporta a sintaxe da expressão regular do Python .
strncmp
estrstr
são outras funções úteis da consulta C.