2010-06-18 12 views
5

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:

  1. 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
  2. Trong gdb, thiết lập kiến ​​trúc i386/file hello/sau đó kết nối tới gdbserver => bad architecture
  3. 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) 

Trả lời

4

Nếu bạn muốn gỡ lỗi quá trình 32-bit sử dụng 64 -bit gdb/gdbserver, bạn cần phiên bản GDB mới hơn. Đặc biệt, bạn cần điều này:

gdbserver/ChangeLog: 

2009-05-12 Doug Evans <[email protected]> 

     Biarch support for i386/amd64 gdbserver. 

Ngoài ra, bạn có thể xây dựng gdb/gdbserver bạn đã có từ nguồn trong chế độ 32-bit bằng cách chạy

./configure CC='gcc -m32' 

và sử dụng gdb32/gdbserver32 để gỡ lỗi các quá trình của bạn . Tôi không thấy bất kỳ lợi thế của việc này mặc dù - phiên bản mới hơn của GDB có nhiều bản sửa lỗi, tăng tốc, và máy in đẹp STL là tốt đẹp.

+0

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. –

+0

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. –

+0

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? –