Come faccio a impostare un punto di interruzione condizionale in gdb, quando char * x punta a una stringa il cui valore è uguale a “ciao”?

StackOverflow https://stackoverflow.com/questions/4183871

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?

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top