Bagaimana cara menetapkan breakpoint bersyarat di gdb, ketika char * x menunjuk ke string yang nilainya sama dengan "halo"?

164

Bisakah saya menentukan bahwa saya ingin gdb untuk istirahat di baris x ketika char* xmenunjuk ke string yang nilainya sama "hello"? Jika ya, bagaimana?

341008
sumber
Catatan: strncmpdan strstradalah fungsi kueri berguna C lainnya.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

198

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.

Nathan Fellman
sumber
9
Catatan: Anda harus sudah menjalankan program sehingga GDB akan melihat stdlib. Sebaliknya:No symbol "strcmp" in current context.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
@CiroSantilli 六四 事件 法轮功 包 卓 轩: Cara mengkonfigurasi gdb untuk melihat stdlib?
naif231
@ naive231 oleh "see" Maksud saya melihat fungsi sehingga Anda dapat merusaknya, bukan sumbernya: Anda harus menekan rununtuk itu sehingga pustaka dinamis dimuat. Untuk sumber, cari dan temukan: stackoverflow.com/questions/10000335/... :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Metode ini dapat memiliki efek samping. $_streqmetode dari @tlwhitec lebih baik.
rools
55
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!

Tobias Domhan
sumber
46

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 .

tlwhitec
sumber