Tôi có hai máy Centos 5 64 bit giống nhau, được nối mạng và chia sẻ/gắn kết nhà của họ. Tôi biên dịch một chương trình Hello World đơn giản trên một, và sau đó tôi đã tìm ra cách sử dụng gdb trên một máy để gỡ lỗi từ xa nó chạy trên máy khác. Điều đó dường như hoạt động tốt khi mọi người mặc định 64 bit. Tuy nhiên, nếu tôi biên dịch Hello World với m32 để tạo ra một nhị phân 32 bit, cách hệ thống đầy đủ của chúng ta đang được biên dịch, thì tôi không thể tìm ra cách để gdb và gdbserver kết nối đúng cách. Trước khi tôi thử nó trên hệ thống đầy đủ của chúng tôi, tôi hình dung tôi nên làm cho nó làm việc với hello. Tùy thuộc vào cách tôi thử kết nối gdb và gdbserver, tôi hoặc nhận được thông báo về sổ đăng ký bị định dạng sai, cảnh báo về sự không khớp kiến trúc hoặc tham chiếu bộ nhớ bất hợp pháp.Sử dụng gdb và gdbserver với nhị phân 32 bit trên máy 64 bit với Centos 5 phàn nàn về truy cập bộ nhớ hoặc dữ liệu bị định dạng sai
Tôi dường như có ít hiểu biết về ý nghĩa của -m32 trong biên dịch của tôi và không có ý tưởng về cách bắt đầu gdb và gdbserver hoặc thứ tự đúng để chỉ định kiến trúc hoặc tệp hoặc gì đó. :(
gì hiện nó đi để sử dụng gdb và gdbserver trên 32 bit (-m32) thực thi trên một hộp linux 64 bit?
Các ví dụ dưới đây, và cảm ơn bạn,
Jerry
Xin chào.cpp:
#include <iostream>
int main(int argc, char *argv[])
{
std::cout << "Hello World." << std::endl;
return -1;
}
Dưới đây là ba chạy:
- Trong gdb, thiết lập kiến trúc i386/sau đó kết nối với gdbserver => kiến trúc xấu
- Trong gdb, thiết lập kiến trúc i386/file hello/sau đó kết nối tới gdbserver => bad architecture
- Trong gdb, thiết lập kiến trúc (không chính xác) i386: x86-64/file hello/sau đó kết nối với gdbserver => Không thể truy cập bộ nhớ
Hoặc trong một chút chi tiết hơn:
==============================
Đối với mỗi lần chạy , các gdbserver từ xa nói:
$ gdbserver --multi rdev6:2010 hello
Process hello created; pid = 32603
Listening on port 2010
Remote debugging from host 134.51.26.149
readchar: Got EOF
Remote side has terminated connection. GDBserver will reopen the connection.
Listening on port 2010
Và trên địa phương của chúng tôi:
============================ ==
- Giả sử nó là i386 32 bit, thiết lập archi để i386, sau đó kết nối lưu ý: ở phía bên gdb, thực thi chưa được chi tiết hoặc nạp
$ gdb
GNU gdb Fedora (6.8-37.el5)
his GDB was configured as "x86_64-redhat-linux-gnu".
(gdb) set archi i386
The target architecture is assumed to be i386
(gdb) target extended-remote rdev6:2010
Remote debugging using rdev6:2010
warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64
Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
Try to load the executable by `file' first,
you may also check `set/show architecture'.
(gdb)
=================== ===========
- Giả sử nó là i386 32 bit, thiết archi để i386, sau đó kết nối lưu ý: ở phía bên gdb, thực thi đã được nạp với tập tin
$ gdb
GNU gdb Fedora (6.8-37.el5)
his GDB was configured as "x86_64-redhat-linux-gnu".
(gdb) set archi i386
The target architecture is assumed to be i386
(gdb) file hello
Reading symbols from /home/j/hello...done.
(gdb) target extended-remote rdev6:2010
Remote debugging using rdev6:2010
warning: Selected architecture i386 is not compatible with reported target architecture i386:x86-64
Remote register badly formatted: T0506:0000000000000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
here: 0000000;07:b0dcdfff00000000;10:1018620000000000;thread:7f5b;
Try to load the executable by `file' first,
you may also check `set/show architecture'.
(gdb) sho archi
The target architecture is assumed to be i386
(gdb)
==============================
- Giả sử (không đúng) là i386: x86-64, thiết archi để i386: x86-64, sau đó kết nối lưu ý: ở phía bên gdb, thực thi đã được nạp với tập tin
$ gdb
GNU gdb Fedora (6.8-37.el5)
This GDB was configured as "x86_64-redhat-linux-gnu".
(gdb) set archi i386:x86-64
The target architecture is assumed to be i386:x86-64
(gdb) file hello
Reading symbols from /home/j/hello...done.
(gdb) show archi
The target architecture is assumed to be i386:x86-64
(gdb) target extended-remote rdev6:2010
Remote debugging using rdev6:2010
[New Thread 32667]
Cannot access memory at address 0x800000008
(gdb)
Cảm ơn bạn rất nhiều, tôi thực sự đánh giá cao sự giúp đỡ của bạn và tôi sẽ cố gắng vào ngày mai tại nơi làm việc. –
Và có, tôi đã xem qua hướng dẫn sử dụng cho gdbserver mới nhất 2 ngày trước, và gần như được vẽ khi tôi tìm thấy các máy in đẹp. –
Xin lỗi vì đã phục hồi một chủ đề rất cũ, nhưng tôi tự hỏi liệu có cách nào không cần cập nhật GDB không. Tôi đang làm việc trên một máy Windows để kết nối, vì vậy tôi có thể xây dựng chế độ 32 bit của gdb cho Windows không? –