Jawaban:
Anda bisa menggunakan strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
adalah nomor baris, x
bisa berupa nama file apa saja dan y
bisa berupa variabel apa saja.
No symbol "strcmp" in current context.
run
untuk itu sehingga pustaka dinamis dimuat. Untuk sumber, cari dan temukan: stackoverflow.com/questions/10000335/... :-)
$_streq
metode dari @tlwhitec lebih baik.
break x if ((int)strcmp(y, "hello")) == 0
Pada beberapa implementasi, gdb mungkin tidak tahu tipe kembalinya strcmp. Itu berarti Anda harus memilih, jika tidak maka akan selalu dinilai benar!
Karena GDB 7.5 Anda dapat menggunakan Fungsi Praktis asli ini :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
Tampaknya kurang bermasalah daripada harus mengeksekusi "asing" strcmp()
pada tumpukan proses 'setiap kali breakpoint terkena. Ini terutama benar untuk debugging proses multithreaded.
Perhatikan bahwa GDB Anda harus dikompilasi dengan dukungan Python, yang bukan merupakan masalah dengan distro linux saat ini. Yang pasti, Anda bisa memeriksanya dengan menjalankan
show configuration
di dalam GDB dan mencari--with-python
. Oneliner kecil ini juga membantu:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
Untuk kasus demo Anda, penggunaannya akan
break <where> if $_streq(x, "hello")
atau, jika breakpoint Anda sudah ada dan Anda hanya ingin menambahkan kondisinya
condition <breakpoint number> $_streq(x, "hello")
$_streq
hanya cocok dengan seluruh string, jadi jika Anda ingin sesuatu yang lebih licik Anda harus menggunakan $_regex
, yang mendukung sintaks ekspresi reguler Python .
strncmp
danstrstr
adalah fungsi kueri berguna C lainnya.