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


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.


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!


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 .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.