Come posso impostare un breakpoint condizionale in gdb, quando char * x punta a una stringa il cui valore è uguale a "ciao"?


Risposte:


198

Puoi usare strcmp:

break x:20 if strcmp(y, "hello") == 0

20è il numero di riga, xpuò essere qualsiasi nome di file e ypuò essere qualsiasi variabile.


9
Nota: è necessario eseguire già il programma in modo che GDB visualizzi lo stdlib. Altrimenti:No symbol "strcmp" in current context.
Ciro Santilli 27 冠状 病 六四 事件 法轮功 il

1
@CiroSantilli 六四 事件 法轮功 包 卓 轩: Come configurare gdb per vedere lo stdlib?
naive231

@ naive231 per "vedere" intendevo vedere le funzioni in modo da poterle interrompere, non l'origine: devi colpire runper quello in modo che vengano caricate le librerie dinamiche. Per la fonte,
cercalo su

1
Questo metodo può avere effetti collaterali. $_streqil metodo da @tlwhitec è migliore.
ruba il

55
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!


46

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 configurationall'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")

$_streqcorrisponde solo all'intera stringa, quindi se vuoi qualcosa di più astuto dovresti usare $_regex, che supporta la sintassi dell'espressione regolare di Python .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.