2009-12-14 36 views
132

Tôi đang thực hiện một số sửa lỗi cấp lắp ráp trong GDB. Có cách nào để GDB hiển thị cho tôi hướng dẫn lắp ráp hiện tại giống như cách nó hiển thị dòng nguồn hiện tại không? Giá trị mặc định sau mỗi lệnh trông như thế này:Hiển thị hướng dẫn lắp ráp hiện tại trong GDB

0x0001433f  990   Foo::bar(p); 

này mang lại cho tôi địa chỉ của lệnh hiện thời, nhưng tôi phải tiếp tục giới thiệu về các sản phẩm của disassemble để xem hướng dẫn tôi hiện đang thực hiện .

+0

Một lắp ráp chung chung hơn HOWTO câu hỏi: http://stackoverflow.com/questions/589653/switching-to-assembly-in-gdb –

+1

Liên quan: http://stackoverflow.com/questions/589653/switching-to-assembly-in-gdb –

Trả lời

236

Bạn có thể chuyển sang bố trí lắp ráp trong GDB:

(gdb) layout asm 

Xem here để biết thêm thông tin. Lệnh assembly hiện tại sẽ được hiển thị trong cửa sổ assembler.

┌───────────────────────────────────────────────────────────────────────────┐ 
    │0x7ffff740d756 <__libc_start_main+214> mov 0x39670b(%rip),%rax  #│ 
    │0x7ffff740d75d <__libc_start_main+221> mov 0x8(%rsp),%rsi    │ 
    │0x7ffff740d762 <__libc_start_main+226> mov 0x14(%rsp),%edi    │ 
    │0x7ffff740d766 <__libc_start_main+230> mov (%rax),%rdx     │ 
    │0x7ffff740d769 <__libc_start_main+233> callq *0x18(%rsp)     │ 
    >│0x7ffff740d76d <__libc_start_main+237> mov %eax,%edi     │ 
    │0x7ffff740d76f <__libc_start_main+239> callq 0x7ffff7427970 <exit>  │ 
    │0x7ffff740d774 <__libc_start_main+244> xor %edx,%edx     │ 
    │0x7ffff740d776 <__libc_start_main+246> jmpq 0x7ffff740d6b9 <__libc_start│ 
    │0x7ffff740d77b <__libc_start_main+251> mov 0x39ca2e(%rip),%rax  #│ 
    │0x7ffff740d782 <__libc_start_main+258> ror $0x11,%rax     │ 
    │0x7ffff740d786 <__libc_start_main+262> xor %fs:0x30,%rax    │ 
    │0x7ffff740d78f <__libc_start_main+271> callq *%rax      │ 
    └───────────────────────────────────────────────────────────────────────────┘ 
multi-thre process 3718 In: __libc_start_main  Line: ?? PC: 0x7ffff740d76d 
#3 0x00007ffff7466eb5 in _IO_do_write() from /lib/x86_64-linux-gnu/libc.so.6 
#4 0x00007ffff74671ff in _IO_file_overflow() 
    from /lib/x86_64-linux-gnu/libc.so.6 
#5 0x0000000000408756 in ??() 
#6 0x0000000000403980 in ??() 
#7 0x00007ffff740d76d in __libc_start_main() 
    from /lib/x86_64-linux-gnu/libc.so.6 
(gdb) 
+2

Tôi nhận được lệnh 'undefined:" layout ".' – greatwolf

+0

@greatwolf, có vẻ như bạn không hỗ trợ tui trong gdb của bạn. Xem câu hỏi này để biết thêm thông tin: http://stackoverflow.com/q/6706838/72178. – ks1322

+4

Gọn gàng! Bây giờ tôi có thể có một cửa sổ tương tự cho thanh ghi không? Thật vậy, tôi có thể: 'layout regs' – Jens

35

Lệnh

x/i $pc 

có thể được thiết lập để chạy tất cả các thời gian sử dụng cơ chế cấu hình bình thường.

+19

Và 'x/ni $ pc' để xem các lệnh n tiếp theo, thường khá hữu ích. –

117

Bạn có thể làm

display/i $pc 

và mỗi lần GDB dừng lại, nó sẽ hiển thị tháo gỡ của lệnh tiếp theo.

GDB-7.0 cũng hỗ trợ set disassemble-next-line on, sẽ tháo rời toàn bộ dòng tiếp theo và cung cấp cho bạn nhiều ngữ cảnh tháo gỡ hơn.

+1

Làm cách nào để bật tính năng này khi sử dụng 'si' (nhưng không phải' s')? – jww

+0

@ jww hoạt động tốt cho tôi ... – tbodt

23

Nếu bạn muốn một vài hướng dẫn sau để hiển thị tự động khi bước qua các chương trình mà bạn có thể sử dụng hiển thị lệnh như sau -

display /3i $pc

trên sẽ hiển thị 3 hướng dẫn bất cứ khi nào một breakpoint được nhấn hoặc khi bạn thực hiện một bước chương trình.

Thêm chi tiết tại mục nhập blog here.

14

Từ trong gdb nhấn Ctrlx2 và màn hình sẽ chia thành 3 phần.

Phần đầu tiên sẽ hiển thị cho bạn mã bình thường ở ngôn ngữ cấp cao.

Thứ hai sẽ hiển thị cho bạn cụm từ tương đương và tương ứng instruction Pointer.

Thứ ba sẽ hiển thị cho bạn lời nhắc thông thường gdb để nhập lệnh.

See the screen shot

+0

Tôi không thể khởi chạy nó bằng 'Ctrl-X 2', nhưng nó trông giống như chế độ' gdb -tui', rất tuyệt. –

+2

Điều này cũng có thể truy cập được với 'phân chia bố cục' từ dấu nhắc gdb. – chucksmash

24

Thiết lập tùy chọn sau đây:

set disassemble-next-line on 
show disassemble-next-line 

sẽ cung cấp cho bạn kết quả tìm kiếm như thế này:

(gdb) stepi 
0x000002ce in ResetISR() at startup_gcc.c:245 
245 { 
    0x000002cc <ResetISR+0>: 80 b5 push {r7, lr} 
=> 0x000002ce <ResetISR+2>: 82 b0 sub sp, #8 
    0x000002d0 <ResetISR+4>: 00 af add r7, sp, #0 
(gdb) stepi 
0x000002d0 245 { 
    0x000002cc <ResetISR+0>: 80 b5 push {r7, lr} 
    0x000002ce <ResetISR+2>: 82 b0 sub sp, #8 
=> 0x000002d0 <ResetISR+4>: 00 af add r7, sp, #0 
+0

Tùy chọn này dường như không tồn tại trong quá trình cài đặt của tôi. Nó đã bị xóa chưa? – fuz

+0

@fuz Nhiều khả năng, gdb của bạn cũ hơn – tbodt

Các vấn đề liên quan