Respostas:
Você pode usar strcmp:
break x:20 if strcmp(y, "hello") == 0
20é o número da linha, xpode ser qualquer nome de arquivo e yqualquer variável.
No symbol "strcmp" in current context.
runpor isso para que as bibliotecas dinâmicas sejam carregadas. Para fonte, google-lo e encontrar: stackoverflow.com/questions/10000335/... :-)
$_streqO 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 configurationGDB 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")
$_streqcorresponde apenas a toda a cadeia; portanto, se você quiser algo mais astuto $_regex, use , que suporta a sintaxe da expressão regular do Python .
strncmpestrstrsão outras funções úteis da consulta C.