2010-11-15 9 views

risposta

153

È possibile utilizzare 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.

+6

Nota: è necessario eseguire già il programma in modo che GDB visualizzi lo stdlib. Altrimenti: 'Nessun simbolo" strcmp "nel contesto attuale. –

+0

@ naive231 di "see" Intendevo vedere le funzioni in modo da poterle interrompere, non la fonte: devi premere 'run' per quello in modo che le librerie dinamiche vengano caricate. Per la fonte, cerca su google e trova: http://stackoverflow.com/questions/10000335/how-to-use-debug-version-of-libc :-) –

39
break x if ((int)strcmp(y, "hello")) == 0 

Su alcune implementazioni gdb potrebbe non conoscere il tipo di ritorno di strcmp. Ciò significa che dovresti lanciare, altrimenti sarebbe sempre vero!

10

Since GDB 7.5 è possibile utilizzare questi a portata di mano Convenience Functions:

$_memeq(buf1, buf2, length)` 
$_streq(str1, str2) 
$_strlen(str) 
$_regex(str, regex) 

sembra abbastanza meno problematico di dover eseguire una "straniera" strcmp() sul processo impilare ogni volta che il punto di interruzione viene colpito.

Nota che il tuo GDB deve essere compilato con il supporto di Python, che non è un problema con le distribuzioni di Linux correnti. Per sicurezza, puoi verificarlo eseguendo show configuration all'interno di GDB e cercando --with-python. Questo piccolo oneliner fa il trucco, troppo:

$ 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 aggiungere il condizioni ad esso

condition <breakpoint number> $_streq(x, "hello") 

$_streq corrisponde solo tutta la str ing, quindi se vuoi qualcosa di più astuto devi usare $_regex, che supporta lo Python regular expression syntax.

Problemi correlati