Risposte:
Puoi usare strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
è il numero di riga, x
può essere qualsiasi nome di file e y
può essere qualsiasi variabile.
No symbol "strcmp" in current context.
run
per quello in modo che vengano caricate le librerie dinamiche. Per la fonte,
$_streq
il metodo da @tlwhitec è migliore.
break x if ((int)strcmp(y, "hello")) == 0
In alcune implementazioni gdb potrebbe non conoscere il tipo restituito di strcmp. Ciò significa che dovresti lanciare, altrimenti valuterebbe sempre come vero!
Da GDB 7.5 è possibile utilizzare queste funzioni di convenienza native :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
Sembra piuttosto meno problematico che dover eseguire uno strcmp()
stack "estraneo" sullo stack del processo ogni volta che viene raggiunto il punto di interruzione. Ciò è particolarmente vero per il debug di processi multithread.
Nota che il tuo GDB deve essere compilato con il supporto Python, che non è un problema con le attuali distribuzioni di Linux. A dire il vero, puoi verificarlo eseguendo
show configuration
all'interno di GDB e cercando--with-python
. Questo piccolo oneliner fa anche il trucco:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
Per il tuo caso demo, l'utilizzo sarebbe
break <where> if $_streq(x, "hello")
oppure, se il punto di interruzione esiste già e si desidera solo aggiungere la condizione ad esso
condition <breakpoint number> $_streq(x, "hello")
$_streq
corrisponde solo all'intera stringa, quindi se vuoi qualcosa di più astuto dovresti usare $_regex
, che supporta la sintassi dell'espressione regolare di Python .
strncmp
estrstr
sono altre utili funzioni di query C.