Hiển thị hướng dẫn lắp ráp hiện tại trong GDB


179

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

0x0001433f      990         Foo::bar(p);

Điều này cho tôi địa chỉ của hướng dẫn hiện tại, nhưng tôi phải tiếp tục tham khảo lại đầu ra disassembleđể xem hướng dẫn nào tôi đang thực hiện.


Câu trả lời:


314

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

(gdb) layout asm

Xem ở đây để biết thêm thông tin. Hướng dẫn lắp ráp hiện tại sẽ được hiển thị trong cửa sổ trình biên dịch.

   ┌───────────────────────────────────────────────────────────────────────────┐
   │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)

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

9
Khéo léo! Bây giờ tôi có thể có một cửa sổ tương tự cho các thanh ghi không? Thật vậy tôi có thể:layout regs
Jens

Xem thêm tài liệu gdb cho các lệnh TUI khác , như tui reg vectorhiển thị regs vector thay vì regs số nguyên. (Không phải lúc nào cũng rất có ích, tuy nhiên, bởi vì nó không cho phép bạn chọn chỉ .v8_int16hoặc một cái gì đó, vì vậy màn hình là một mớ hỗn độn lớn.) Hãy xem thẻ x86 wiki cho một hướng dẫn nhanh chóng để gỡ lỗi asm.
Peter Cordes

Đó là về một tính năng và đầu ra vô dụng. Các tên được đọc sai của C ++ quá dài và mọi thứ tôi đang cố gắng xem đều ở bên phải màn hình. Thật là một quyết định ngu ngốc (không hiển thị ASM theo mặc định khi nào si) và tính năng vô dụng (chế độ xem không hiển thị thông tin cần thiết). Không có ý nghĩa trong xuống bỏ phiếu câu trả lời này kể từ khi bạn chỉ sứ giả ...
jww

1
tương tự, ·layout srcđể xem mã nguồn khi gỡ lỗi và cũng đáng ghi nhớ thoát khỏi chế độ này bằng cáchCTRL+x+a
Baiyan Huang

149

Bạn có thể làm

display/i $pc

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

GDB-7.0cũ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 hơn về bối cảnh tháo gỡ.


1
Làm thế nào để chúng tôi kích hoạt tính năng này khi sử dụng si(nhưng không s)?
jww

54

Lệnh

x/i $pc

có thể được thiết lập để chạy mọi lúc bằng cơ chế cấu hình thông thường.


29
x/ni $pcđể xem các hướng dẫn n tiếp theo, thường là khá hữu ích.
Stephen Canon

48

Đặt tùy chọn sau:

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

Sẽ cho bạn kết quả 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

Tùy chọn này dường như không tồn tại trong cài đặt của tôi. Nó đã được gỡ bỏ?
fuz

2
@fuz Nhiều khả năng, gdb của bạn đã cũ
tbodt

@fuz có mặt ít nhất trong GDB 8.1 trong Ubuntu 18.04.
Ciro Santilli 郝海东 冠状 病 事件

kỹ năng rất hữu ích
DaSqy Stc

1
hiển thị tháo rời-dòng tiếp theo là để thử nghiệm, để in trạng thái cờ, bật hoặc tắt
Sam

30

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

display /3i $pc

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

Thêm chi tiết tại mục blog ở đây .


23

Từ bên trong gdb nhấn Ctrl x 2và màn hình sẽ chia thành 3 phần.

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

Thứ hai sẽ cho bạn thấy lắp ráp tương đương và tương ứng instruction Pointer.

Thứ ba sẽ trình bày cho bạn gdblời nhắc bình thường để nhập lệnh.

Xem ảnh chụp màn hình


Tôi không thể khởi chạy nó Ctrl-X 2, nhưng nó trông giống như gdb -tuichế độ, điều này thật tuyệt.
Ciro Santilli 郝海东 冠状 病 事件

7
Điều này cũng có thể truy cập với layout splittừ dấu nhắc gdb.
chucksmash

22

Bảng điều khiển GDB

https://github.com/cyrus-and/gdb-dashboard

Cấu hình GDB này sử dụng API Python GDB chính thức để hiển thị cho chúng tôi bất cứ điều gì chúng tôi muốn bất cứ khi nào GDB dừng lại next, ví dụ như TUI.

Tuy nhiên, tôi đã thấy rằng việc triển khai này là một sự thay thế mạnh mẽ và có thể định cấu hình hơn cho chế độ TUB GDB tích hợp như được giải thích tại: chế độ xem tách gdb với mã

Ví dụ: chúng ta có thể định cấu hình Bảng điều khiển GDB để hiển thị quá trình tháo gỡ, nguồn, thanh ghi và ngăn xếp với:

dashboard -layout source assembly registers stack

Đây là giao diện nếu bạn bật tất cả các chế độ xem có sẵn:

nhập mô tả hình ảnh ở đây

Câu hỏi liên quan:


1
@downvoters: vui lòng giải thích để tôi có thể tìm hiểu và cải thiện thông tin. Tôi tin rằng đây là một giải pháp thay thế ưu việt cho câu trả lời hiện đang được chấp nhận của TUI: stackoverflow.com/a/2015523/895245
Ciro Santilli 冠状 病 六四 法轮功
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.