Como defino um ponto de interrupção condicional no gdb, quando char * x aponta para uma string cujo valor é igual a "olá"?

164

Posso especificar que quero que o gdb quebre na linha x quando char* xaponta para uma string cujo valor é igual "hello"? Se sim, como?

341008
fonte
Nota: strncmpe strstrsão outras funções úteis da consulta C.
Ciro Santilli respondeu

Respostas:

198

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.

Nathan Fellman
fonte
9
Nota: você já deve estar executando o programa para que o GDB veja o stdlib. Caso contrário:No symbol "strcmp" in current context.
Ciro Santilli escreveu
1
@CiroSantilli 轩 事件 g 包 卓: Como configurar o gdb para ver o stdlib?
naive231
@ naive231 por "ver", eu quis dizer ver funções para que você possa quebrá-las, não a fonte: você tem que pressionar runpor isso para que as bibliotecas dinâmicas sejam carregadas. Para fonte, google-lo e encontrar: stackoverflow.com/questions/10000335/... :-)
Ciro Santilli郝海东冠状病六四事件法轮功
1
Este método pode ter efeitos colaterais. $_streqO método @tlwhitec é melhor.
Rools 14/04/19
55
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!

Tobias Domhan
fonte
46

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 .

tlwhitec
fonte