2010-03-10 14 views
68

Tôi nằm ngoài mục tiêu của gdb và tôi thậm chí không có ngăn xếp tương ứng với mục tiêu đó. Dù sao tôi cũng muốn một bước, để tôi có thể xác minh những gì đang xảy ra trong mã assembly của tôi, bởi vì tôi không phải là một chuyên gia tại hội đồng x86. Thật không may, gdb từ chối thực hiện việc gỡ lỗi mức lắp ráp đơn giản này. Nó cho phép tôi thiết lập và dừng lại trên điểm ngắt thích hợp, nhưng ngay sau khi tôi cố gắng đơn bước trở đi, gdb báo cáo lỗi "Không thể tìm thấy giới hạn của chức năng hiện tại" và EIP không thay đổi.Sử dụng gdb để mã một bước lắp ráp bên ngoài lỗi nguyên nhân thực thi được chỉ định "không thể tìm thấy giới hạn của hàm hiện tại"

chi tiết bổ sung:

Mã máy được tạo ra bởi báo cáo asm gcc và tôi sao chép nó vào vị trí bộ nhớ hạt nhân mà nó thực hiện, từ đầu ra của -d objdump. Tôi sẽ không bận tâm một cách đơn giản để sử dụng một bộ nạp để tải mã đối tượng của tôi đến một địa chỉ được di dời, nhưng nhớ rằng việc nạp phải được thực hiện trong một mô-đun hạt nhân.

Tôi giả sử một giải pháp thay thế khác là tạo ra một mô-đun hạt nhân giả hoặc tệp thông tin gỡ lỗi để cung cấp cho gdb, để làm cho nó tin rằng khu vực này nằm trong mã chương trình. gdb hoạt động tốt trên hạt nhân thực thi chính nó.

(Đối với những người thực sự muốn biết, tôi đang chèn mã vào thời gian chạy vào không gian dữ liệu hạt nhân Linux bên trong VMware VM và gỡ lỗi từ gdb remote gỡ lỗi hạt nhân thông qua bản dựng gdb được xây dựng trong VMware Workstation. m không viết khai thác hạt nhân; Tôi là một sinh viên tốt nghiệp bảo mật viết một mẫu thử nghiệm.)

(Tôi có thể đặt điểm ngắt trên mỗi lệnh trong assembly của tôi). hướng dẫn lắp ráp x86 khác nhau và vị trí lắp ráp sẽ thay đổi mỗi khi tôi khởi động lại.)

+0

Thông minh http://www.ksplice.com/ folks tiêm dữ liệu và mã vào hạt nhân bằng cách lắp ráp các mô-đun hạt nhân "giả" và tải chúng. Và nếu họ có thể làm điều đó, tại sao bạn không thể? ;-) – ephemient

Trả lời

90

Bạn có thể sử dụng stepi hoặc nexti (có thể viết tắt là t o si hoặc ni) để duyệt qua mã máy của bạn.

+1

Chà. Nhìn lại tôi không làm thế nào tôi quên về stepi. Tôi đoán tôi chỉ giả định bởi vì gdb không có mã nguồn mà bước sẽ trở lại hướng dẫn lắp ráp. – Paul

+0

lưu ý: bạn thường không thể nhập "ngắt chính", "chạy" cho các chương trình lắp ráp. Nhập "bố cục asm", "bắt đầu" thay thế. Tôi nhận được điều này từ đọc tin nhắn dưới đây nhưng ai đó đọc bài đăng này có thể không phải là bệnh nhân. – Dmitry

22

Điều hữu ích nhất bạn có thể thực hiện ở đây là display/i $pc, trước khi sử dụng stepi như đã được đề xuất trong câu trả lời của R Samuel Klatchko. Điều này cho gdb để tháo rời lệnh hiện tại ngay trước khi in dấu nhắc mỗi lần; sau đó bạn có thể tiếp tục nhấn Enter để lặp lại lệnh stepi.

(Xem my answer to another question để xem chi tiết hơn - bối cảnh của câu hỏi đó là khác nhau, nhưng nguyên tắc là như nhau.)

126

Thay vì gdb, chạy gdbtui. Hoặc chạy gdb bằng công tắc -tui. Hoặc nhấn C-x C-a sau khi nhập gdb. Bây giờ bạn đang ở chế độ TUI của GDB.

Nhập layout asm để làm cho cụm hiển thị trên cửa sổ - điều này sẽ tự động theo con trỏ chỉ dẫn của bạn, mặc dù bạn cũng có thể thay đổi khung hoặc cuộn xung quanh trong khi gỡ lỗi. Nhấn C-x s để vào chế độ SingleKey, trong đó run continue up down finish vv được viết tắt thành một khóa duy nhất, cho phép bạn đi qua chương trình của bạn rất nhanh chóng.

 
    +---------------------------------------------------------------------------+ 
B+>|0x402670 <main>   push %r15          | 
    |0x402672 <main+2>  mov %edi,%r15d         | 
    |0x402675 <main+5>  push %r14          | 
    |0x402677 <main+7>  push %r13          | 
    |0x402679 <main+9>  mov %rsi,%r13         | 
    |0x40267c <main+12>  push %r12          | 
    |0x40267e <main+14>  push %rbp          | 
    |0x40267f <main+15>  push %rbx          | 
    |0x402680 <main+16>  sub $0x438,%rsp         | 
    |0x402687 <main+23>  mov (%rsi),%rdi         | 
    |0x40268a <main+26>  movq $0x402a10,0x400(%rsp)      | 
    |0x402696 <main+38>  movq $0x0,0x408(%rsp)       | 
    |0x4026a2 <main+50>  movq $0x402510,0x410(%rsp)      | 
    +---------------------------------------------------------------------------+ 
child process 21518 In: main       Line: ?? PC: 0x402670 
(gdb) file /opt/j64-602/bin/jconsole 
Reading symbols from /opt/j64-602/bin/jconsole...done. 
(no debugging symbols found)...done. 
(gdb) layout asm 
(gdb) start 
(gdb) 
+0

Tuyệt vời. Tôi đã sử dụng giao diện người dùng emacs trước đây, nhưng tôi không có ý tưởng gdb đã có một TUI được xây dựng trong. – Paul

+0

điều này thật tuyệt vời! – xis

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