Come faccio a impostare un punto di interruzione condizionale in gdb, quando char * x punta a una stringa il cui valore è uguale a “ciao”?
-
10-10-2019 - |
Domanda
Posso specificare che voglio gdb per rompere in linea x quando i punti char* x
in una stringa il cui valore è uguale "hello"
? Se sì, come?
Soluzione
È possibile utilizzare strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
è il numero di riga, x
può essere qualsiasi nome e y
può essere qualsiasi variabile.
Altri suggerimenti
break x if ((int)strcmp(y, "hello")) == 0
In alcune implementazioni gdb potrebbero non si conosce il tipo di ritorno di strcmp. Ciò significa che si dovrebbe avere per fusione, altrimenti sarebbe sempre valutata come vera!
Dal momento che GDB 7.5 è possibile utilizzare questi a portata di mano Convenienza Funzioni :
$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)
Sembra molto meno problematica di dover eseguire un strcmp()
"straniero" sul processo di impilare ogni volta che il punto di interruzione viene colpito.
Si noti vostre esigenze GDB per essere compilato con il supporto Python, che non è un problema con distribuzioni Linux correnti. Per essere sicuri, è possibile controllare eseguendo
show configuration
all'interno GDB e la ricerca di--with-python
. Questo piccolo oneliner fa il trucco, anche:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
Per il vostro caso demo, l'utilizzo sarebbe
break <where> if $_streq(x, "hello")
o, se il punto di interruzione esiste già e si desidera solo per aggiungere la condizione ad essa
condition <breakpoint number> $_streq(x, "hello")
$_streq
corrisponde solo l'intera stringa, quindi se volete qualcosa di più furbo si dovrebbe usare $_regex
, che supporta il Python espressione regolare sintassi .