2011-12-28 20 views
14

Tôi đang cố gỡ lỗi hạt nhân Linux bằng vm vm. Tôi nhận được một thông báo lỗi "Remote 'g' trả lời gói quá dài". Máy chủ của tôi là 64 bit và vm của tôi cũng vậy.Trả lời gói 'g' từ xa quá dài

bước của tôi:

  1. Khởi động máy ảo với -kernel tùy chỉnh, và các tùy chọn -initrd -Nối.
  2. Bắt đầu gdb
  3. Execute "thiết lập kiến ​​trúc i386: x86-64: intel"
  4. Execute "add-biểu tượng file linux-3.0/vmlinux"
  5. Execute "show vòm" để xác minh của nó vẫn còn "i386 : x86-64: intel"
  6. Execute "mục tiêu từ xa localhost: 1234"
  7. Execute "tiếp tục"
  8. Nhấn Ctrl + C, tôi nhận được thông báo ở trên.

Có ai phải đối mặt với vấn đề này không?

+0

vm của tôi chạy ubuntu và máy chủ đang chạy debian – contemplatingzombie

+0

Nếu tôi thấy mã gdb, remote.c/* Mô tả của thanh ghi giao thức từ xa. */long sizeof_g_packet; không phù hợp với dự kiến. Có vẻ như gdbserver của bạn không được định cấu hình đúng cách (tôi không chắc lắm). Bạn có đang khởi tạo máy chủ GDB không? Nếu có, phiên bản GDB và GDBSERVER của bạn phù hợp? – Kamath

+0

Tương tự trên trình theo dõi GDB: https://sourceware.org/bugzilla/show_bug.cgi?id=13984 –

Trả lời

8

Tôi cũng phải đối mặt với cùng một vấn đề, tôi cố định nó bằng cách sửa đổi gdbstub.c (trong nguồn Qemu) để gửi thanh ghi 64bit luôn và gợi ý GDB kiến ​​trúc đó là 64bit bằng cách thông qua set arch i386:x86-64

Bạn có thể kiểm tra các bản vá ở đây: Truy cập [URL không còn khả dụng]

+0

cảm ơn. Tôi sẽ thử nó đôi khi. – contemplatingzombie

+3

Tôi không phải vá QEMU - chỉ cần nói cho GDB 'bộ vòm i386: x86-64' đủ để nó hoạt động cho tôi. –

+0

... điều này rất tốt vì URL của bạn hiện đã lỗi thời. –

11

gdb không hoạt động tốt với cpu chuyển đổi giữa các bộ lệnh khi chạy. Đợi hạt nhân rời khởi động sớm trước khi kết nối và không sử dụng cờ -S của qemu.

+0

Làm việc hoàn hảo cho tôi sau khi loại bỏ tùy chọn -S –

+0

Điều đó làm việc cho tôi! –

+4

Có, nhưng * cách *? Tôi cần phải dừng hạt nhân trước khi nó bị hỏng; để ngăn chặn nó trước khi đâm, tôi cần 'gdb'. Nếu tôi "chờ", hạt nhân bị treo. : P – Thanatos

5

Tôi tìm thấy một vấn đề tương tự (& câu hỏi này) kết nối gdb rất sớm trong quá trình khởi động - như đã đề cập trong các câu trả lời khác, gdb không đánh giá cao kích thước của sổ đăng ký thay đổi từ dưới nó. Vấn đề này có thể được nhìn thấy bằng cách sử dụng set debug remote 1:

(gdb) set debug remote 1 
(gdb) target remote localhost:1234 
Remote debugging using localhost:1234 
... 
Sending packet: $g#67...Ack 
Packet received: 000000000000000... <~600 bytes> 
(gdb) until *0x1000 # at this address we'll be in a different cpu mode 
... 
Sending packet: $g#67...Ack 
Packet received: 10000080000000000000000000000000800000c... <~1000 bytes> 
... 
Remote 'g' packet reply is too long: 1000008000000000000000000... 
(gdb) 

Patching gdb to resize its internal buffer when it sees a too-large packet như được tìm thấy về vấn đề này trong bộ theo dõi gdb lỗi (và các nơi khác), không thực sự làm việc xung quanh vấn đề này, như không vá qemu chỉ gửi 64-bit các gói được kích thước. Tuy nhiên, the latter solution breaks debugging in non-64-bit-modes, và có vẻ như rằng việc sửa chữa cựu có thể không đầy đủ:

Nghe có vẻ khá sai lầm khi được thay đổi mục tiêu sau lưng GDB khi GDB là đã gỡ lỗi nó. Không chỉ kích thước của các gói g/G có thể thay đổi vô tình, nhưng bố trí là tốt. Nếu mô tả mục tiêu thay đổi với cấu hình lại của bạn, nó âm thanh với tôi như GDB sẽ tìm nạp/tính toán lại toàn bộ mô tả mục tiêu . Hôm nay, tôi nghĩ rằng chỉ có thể thực hiện với việc ngắt kết nối/kết nối lại .

- https://sourceware.org/ml/gdb/2014-02/msg00005.html

Các ngắt kết nối/kết nối lại workaround đề cập ở phần cuối của bài viết không xuất hiện để làm việc:

(gdb) disconnect 
Ending remote debugging. 
(gdb) set architecture i386:x86-64 
The target architecture is assumed to be i386:x86-64 
(gdb) target remote localhost:1234 
Remote debugging using localhost:1234 
(gdb) info registers 
rax   0x80000010 2147483664 
rbx   0x0 0 
... 
+2

Tôi nhận được cùng một gói 'Remote' g 'quá dài' ngay lập tức sau khi chạy 'target remote localhost: 1234' một lần nữa. – Thanatos

+0

@Thanatos nó làm việc cho tôi. Đây là thiết lập đầy đủ chi tiết của tôi: http://stackoverflow.com/questions/4943857/linux-kernel-live-debugging-how-its-done-and-what-tools-are-used/42316607#42316607 –

0

tôi đã vô tình bỏ qua tên nhị phân như một cuộc tranh cãi với gdb. Vì vậy, điều này làm việc cho tôi.

$ gdb ./vmlinux 
(gdb) target remote localhost:1234 

Và sau đó có đầu ra:

Remote debugging using localhost:1234 
0xffffffff81025f96 in default_idle() 

Các debugger cần vmlinux do đó hãy chắc chắn rằng bạn cung cấp cho nó. OP có một vấn đề khác, nhưng câu trả lời của tôi có thể giúp cho những người quên cung cấp đối số cho gdb và kết thúc với thông báo lỗi tương tự như OP.

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