Jawaban:
Anda bisa menggunakan strcmp:
break x:20 if strcmp(y, "hello") == 0
20adalah nomor baris, xbisa berupa nama file apa saja dan ybisa berupa variabel apa saja.
No symbol "strcmp" in current context.
rununtuk itu sehingga pustaka dinamis dimuat. Untuk sumber, cari dan temukan: stackoverflow.com/questions/10000335/... :-)
$_streqmetode 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 configurationdi 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")
$_streqhanya cocok dengan seluruh string, jadi jika Anda ingin sesuatu yang lebih licik Anda harus menggunakan $_regex, yang mendukung sintaks ekspresi reguler Python .
strncmpdanstrstradalah fungsi kueri berguna C lainnya.