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?


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


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!

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.