Bagaimana cara memecahkan instruksi perakitan di alamat tertentu di gdb?

97
0x0000000000400448 <main+0>:    push   %rbp
0x0000000000400449 <main+1>:    mov    %rsp,%rbp
0x000000000040044c <main+4>:    mov    $0x6,%eax
0x0000000000400451 <main+9>:    leaveq 
0x0000000000400452 <main+10>:   retq   

Saya mencoba:

breaki 0x0000000000400448

tetapi tampaknya tidak ada perintah seperti itu.

Apakah gdb memiliki fitur seperti itu?

kompilasi-kipas
sumber
3
kenapa breaki? apakah itu salah ketik?
phil294
2
@Blauhirn Mungkin sebagai analogi yang seharusnya dengan stepidan nexti, yang digunakan untuk langkah tunggal di tingkat instruksi.
Per Lundberg

Jawaban:

147

mencoba break *0x0000000000400448

Laurent G
sumber
15
Mungkin karena * diperlukan untuk menentukan alamat. lihat sourceware.org/gdb/current/onlinedocs/gdb/…
Laurent G
4
Dan tentu saja Anda dapat menghapus angka nol di depan dan menyingkat break, berikan b *0x400448.
pengguna202729
Untuk membedakan dengan fungsi atau data bernama 0x0000000000400448(tidak biasa seperti itu!)
Dan Anderson
1
@ compile-fan break * address Tetapkan breakpoint di alamat alamat. Anda dapat menggunakan ini untuk menyetel breakpoint di bagian program Anda yang tidak memiliki informasi debug atau file sumber. ftp.gnu.org/old-gnu/Manuals/gdb/html_node/gdb_28.html Saya sedang men -debug kode assembly dan sampai di sini untuk pertanyaan yang sama dengan yang Anda ajukan.
P4cK3tHuNt3R
63

Cara lain:

break *main+4

Ini akan menambah breakpoint di 0x000000000040044c
saya pikir ini lebih mudah daripada menulis seluruh alamat!

jyz
sumber