Posso specificare che voglio che gdb si interrompa alla riga x quando i punti char* x
si riferiscono a una stringa il cui valore equivale a "hello"
? Se sì, come?Come imposto un breakpoint condizionale in gdb, quando char * x punta a una stringa il cui valore equivale a "ciao"?
risposta
È 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.
Nota: è necessario eseguire già il programma in modo che GDB visualizzi lo stdlib. Altrimenti: 'Nessun simbolo" strcmp "nel contesto attuale. –
@ 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 :-) –
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!
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.
- 1. Come passare a un breakpoint in gdb?
- 2. GDB: esecuzione fino a breakpoint specifico
- 3. In C, perché non è possibile assegnare un valore intero a un int * nello stesso modo in cui un valore stringa può essere assegnato a un char *?
- 4. Punto di interruzione condizionale GDB su tipi arbitrari
- 5. breakpoint gdb su pthread_create
- 6. jdb breakpoint condizionale
- 7. Fino a quando l'input dell'utente equivale a qualcosa da fare
- 8. Somma in cui il valore è x
- 9. "& s [0]" punta a caratteri contigui in una stringa: std ::?
- 10. Come convertire char [] a stringa in java?
- 11. Equivale a get_contents_to_file in boto3
- 12. Come assegnare una stringa a char * pw in C++
- 13. libunistring u8_strlen() equivale a strlen()?
- 14. gdb: errore interno impostazione dei breakpoint
- 15. Interruzione quando a una variabile viene assegnato un valore
- 16. Modifica stringa char in corrispondenza dell'indice X
- 17. Stringa di stampa a cui si fa riferimento dal registro in GDB
- 18. strcat concat un char su una stringa?
- 19. equivale a Arrays.equals in Java
- 20. A cosa punta un delegato?
- 21. Come imposto il valore predefinito di un intero in mongodb?
- 22. IntPtr.Zero equivale a null?
- 23. Come si elimina un puntatore senza eliminare i dati a cui punta il puntatore?
- 24. Equivale a InvokeRequired in WPF
- 25. Differenza tra char a [] = "stringa"; char * p = "stringa";
- 26. Conversione da stringa a char - C++
- 27. aggiungendo una codifica del char a ruby 1.9.x?
- 28. Una riga in un programma Java equivale a un'istruzione?
- 29. Come convertire char * a un sistema :: string^
- 30. Passare la stringa C# a C++ e passare il risultato C++ (stringa, char * .. qualunque) a C#
Nota: 'strncmp' e' strstr' sono altre utili funzioni di interrogazione C. –