2009-05-26 27 views
5

Tôi đã viết một chương trình Qt rất đơn giản ở đây:Sau khi thiết lập một breakpoint trong Qt, gdb nói: "truy cập Lỗi địa chỉ bộ nhớ"

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 

    QTableView table(&frame); 
    table.resize(100, 100); 
    table.show(); 

    return app.exec(); 
} 

Và khi tôi cố gắng thiết lập một breakpoint nơi bàn được nhấn vào, tôi nhận được lỗi này từ gdb:

(gdb) symbol-file /usr/lib/libQtGui.so.4.4.3.debug 
Load new symbol table from "/usr/lib/libQtGui.so.4.4.3.debug"? (y or n) y 
Reading symbols from /usr/lib/libQtGui.so.4.4.3.debug...done. 
(gdb) br 'QAbstractItemView::clicked(QModelIndex const&)' 
Breakpoint 1 at 0x5fc660: file .moc/release-shared/moc_qabstractitemview.cpp, line 313. 
(gdb) run 
Starting program: ./qt-test 
Warning: 
Cannot insert breakpoint 1. 
Error accessing memory address 0x5fc660: Input/output error. 

có ai biết lý do tại sao các breakpoint không thể chèn?

+0

Tôi đang sử dụng Ubuntu Intrepid và tôi đã cài đặt libqt4-dbg, nếu điều đó có ích. – Neil

Trả lời

2

Nếu bạn muốn tự động ngắt bằng chính mà không đặt điểm ngắt, bạn cũng có thể sử dụng lệnh start.
Nếu bạn cần phải cung cấp bất kỳ đối số cho các chương trình mà bạn có thể sử dụng:
start argument1 argument2

11

Không sử dụng lệnh gdb symbol-file để tải biểu tượng bên ngoài. Các địa chỉ điểm ngắt sẽ sai vì chúng không được di dời.

Thay vào đó, hãy đặt một breakpoint trong main, chạy chương trình, và sau đó đặt breakpoint của bạn:

gdb ./program 
GNU gdb 6.8-debian blah blah blah 
(gdb) br main 
Breakpoint 1 at 0x80489c1 
(gdb) run 
Starting program: ./program 
Breakpoint 1, 0x080489c1 in main() 
(gdb) br 'QAbstractItemView::clicked(QModelIndex const&)' 
Breakpoint 2 at 0xb7d24664 
(gdb) continue 
Continuing. 

Sau đó thực hiện breakpoint của bạn xảy ra.

Đảm bảo chỉ định danh sách tham số trong hàm bạn muốn đặt điểm ngắt, không có tên của các thông số đó, chỉ là các loại của chúng.

+4

Nhờ pholklore trong #gdb trong irc.freenode.net cho câu trả lời này. – Neil

+0

Bạn cũng có thể chỉ đặt một điểm ngắt trên bất kỳ thứ gì bạn thích mà không vi phạm lệnh main() trước và gdb sẽ hỏi bạn xem bạn có muốn đặt điểm ngắt đang chờ xử lý hay không. Tuy nhiên, bằng cách này bạn không bao giờ có thể chắc chắn nếu chức năng đó thực sự tồn tại, hoặc nếu bạn thực hiện một lỗi đánh máy. Vì vậy, phương pháp minh họa trong câu trả lời là an toàn hơn. – Neil

+0

Điều này đã khắc phục được một số vấn đề kỳ lạ mà tôi gặp phải; cảm ơn. – Qix

4

Các lỗi thực tế:

Error accessing memory address 0x5fc660: Input/output error.

có thể được gây ra bởi 32/64 mixups bit. Ví dụ, hãy kiểm tra xem bạn đã không đính kèm với một nhị phân 32 bit có ID quá trình 64 bit hay ngược lại.

+0

Tôi có vấn đề này, nhưng tôi không thể tìm ra cách làm cho nó sử dụng gdb đúng cách: ( – froginvasion

+0

Và bitness-mismatch không phải là vấn đề? –

+0

Xuất hiện rằng tôi phải thêm tùy chọn '-g' vào makefile, và điều đó đã khắc phục được sự cố. Tìm thấy nó ở đâu đó trên stackoverflow, nhưng tôi không biết nó làm gì. – froginvasion

1

OK cho tôi Tôi nhận được điều này khi xây dựng với mingw-w64 (trình biên dịch gốc hoặc chéo). Tôi không chắc chắn vấn đề chính xác là gì, nhưng nếu tôi xây dựng nó bằng cách sử dụng gcc mingw-w64 i686-5.1.0-posix-sjlj-rt_v4-rev0 thì nó tạo ra (cuối cùng) các bản dựng được debuggable. Nếu không

(gdb) break main 
... 
(gdb) r 
... 
Cannot insert breakpoint 1. 
Cannot access memory at address 0x42445c 
<process basically hangs> 

tin nhắn 19 lần trong số 20, mặc dù đôi khi nó thực sự hoạt động (rất hiếm khi).

gdb 7.8.1 và 7.9.1 dường như có thể gỡ lỗi exe đã tạo. Vì vậy, nó có lẽ không phải là phiên bản của gdb mà làm cho một sự khác biệt.

Lý thuyết/nghi ngờ hiện tại của tôi là phiên bản gcc hoặc có thể là "khía cạnh" sljl so với dwarf2 đối với trình biên dịch [?] (I686-492-posix-dwarf-rt_v3-rev1 không hoạt động, và việc biên dịch chéo với một số dạng gcc 4.9.2 cũng vậy). Không thử các phiên bản gcc khác.

cập nhật: gcc mới hơn (5.1.0) nhưng biên dịch chéo Tôi vẫn gặp lỗi này. Nguyên nhân trong trường hợp trường hợp này trở thành thư viện phụ thuộc mà bản dựng của tôi (FFmpeg) đang sử dụng bằng cách liên kết với (libgme trong trường hợp này) đang xuất ra một vài biểu tượng "được chia sẻ" sai (khi tôi xây dựng một tệp thực thi tĩnh) . Bởi vì điều này, "chia sẻ" xây dựng phanh (https://trac.ffmpeg.org/ticket/282) và bằng cách nào đó nó vít lên gdb là tốt.Ví dụ, có thể liên kết với SDL cũng có thể làm điều này với bạn. Suy nghĩ của tôi có thể là lỗi ld [?]

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