2011-08-30 19 views
10

Tôi đã xem chủ đề this. Trường hợp của tôi hơi khác một chút và tôi đang cố gắng tìm ra cách con trỏ "this" bị hỏng."con trỏ" này bị lỗi trong theo dõi ngăn xếp

Tôi đang sử dụng khung Qt 4.6.2, sử dụng QTreeView với mô hình của riêng tôi. Các backtrace tôi nhận được (86 khung hình dài, với rất nhiều đệ quy, đó là lý do tại sao tôi đã không dán toàn bộ điều trong, nó trong này pastebin chỉ liên quan đến mã của họ. deref, nhưng nó rõ ràng rằng nó đã chết tiếp tục xuống, bằng chứng là ba khung:.

#15 0x01420fd3 in QFrame::event (this=0x942bba0, e=0xbf8eb624) at widgets/qframe.cpp:557 
#16 0x014bb382 in QAbstractScrollArea::viewportEvent (this=0x4, e=0x93f9240) at widgets/qabstractscrollarea.cpp:1036 
#17 0x0156fbd7 in QAbstractItemView::viewportEvent (this=0x942bba0, event=0xbf8eb624) at itemviews/qabstractitemview.cpp:1610 

trong khung 17, this0x942bb0 trong khung 16, this nên giống nhau, như trong khung 17 nó đang gọi của nó thực hiện cùng một phương thức của tổ tiên Tuy nhiên, this trở thành 0x4.

Điều thú vị đủ trong khung 15 (một lần nữa, khung 16 đã được gọi là tổ tiên của nó thực hiện cùng chức năng), con trỏ 'này' được khôi phục thành 0x942bba0.

Nếu bạn nhìn vào dấu vết của backtrace đầy đủ, bạn có thể thấy một số 'tối ưu hóa giá trị'. Tôi đã có ứng dụng được biên dịch với tối ưu hóa; Bây giờ tôi đã đặt gcc thành -g3 -O0 vì vậy khi nó xảy ra vào lần tới, tôi có thể có thứ gì đó hơn. Nhưng tất nhiên bây giờ tôi không thể làm cho nó sụp đổ - đó là một lỗi khá khó khăn để làm cho xảy ra (nhưng rất quan trọng để sửa chữa dù sao) vì vậy tôi không nghĩ rằng đó là quá đáng ngờ.

Được tối ưu hóa, có phải là thispointer=0x4 không bình thường hoặc chắc chắn sai? Điều kỳ lạ là không có mã thực trong bất kỳ khung viewportEvent nào - chúng chỉ đơn giản là thực hiện một chuyển đổi trên loại sự kiện, nó rơi qua câu lệnh switch và nó trả về việc thực hiện của tổ tiên nó.

Valgrind dường như không phát sinh bất kỳ vấn đề nào, mặc dù tôi chưa gây ra sự cố trong Valgrind.

Có ai đã từng xem hành vi này trước đây không? Điều gì có thể gây ra nó?

+1

+1, từ lâu tôi đã thấy cùng vấn đề với mã của mình; Tôi không biết làm thế nào tôi đã sửa nó; nhưng nhắc tôi về thời xưa.:) – iammilind

+0

Khi bạn biên dịch mã, có cảnh báo nào không? Hãy sửa chúng trước. –

+0

@iammilind: Đó là lý do để làm cho câu hỏi này trở thành một câu hỏi yêu thích (bằng cách nhấp vào dấu sao), nhưng không phải để bỏ phiếu. –

Trả lời

8

Tôi đã thấy loại điều này trước khi gỡ lỗi các bản dựng được tối ưu hóa và nó chưa bao giờ là dấu hiệu cho thấy lỗi thực sự là gì đối với tôi.

Đầu tiên bạn nên suy nghĩ về biến cục bộ. Trong một bản dựng không được tối ưu hóa, mọi thứ đều có vị trí được chỉ định trong bộ nhớ và phải được lưu trữ sau mỗi dòng mã. Điều này là để trình gỡ lỗi có thể tìm thấy nó. Trong một bản dựng được tối ưu hóa, các giá trị có thể sống trong sổ đăng ký mà không được ghi vào bộ nhớ. Đây là một phần chính của hiệu suất được cải thiện của một bản dựng được tối ưu hóa. Trình gỡ lỗi không hiểu điều này và sẽ luôn xem bộ nhớ, vì vậy bạn thường thấy giá trị sai.

Điều tương tự cũng có thể xảy ra với thông số. Nếu trình tối ưu hóa quyết định chuyển một tham số trong thanh ghi, trình gỡ lỗi vẫn sẽ xem xét khung xếp chồng. Cụ thể hơn, tại vị trí mà thông số sẽ theo quy tắc của quy ước gọi điện.

Thực tế khung tiếp theo của ngăn xếp có giá trị được khôi phục đúng chỉ ra rằng các hướng dẫn được tạo sẽ xử lý đúng thông số này, nhưng trình gỡ lỗi chỉ không biết tìm kiếm ở đâu.

+0

Một biến thể khác về điều này là ngay cả khi tham số được truyền trên ngăn xếp, trình tối ưu hóa có thể sử dụng lại vị trí bộ nhớ cho một thứ khác khi nó được thực hiện bằng cách sử dụng vị trí cho tham số. Vì vậy, nó có thể là 'con trỏ này = 0x4' trong backtrace là một cá trích đỏ - đặc biệt là nếu tham số con trỏ' this' này hiển thị chính xác trong các khung được đánh số thấp hơn. –

+0

Cảm ơn người bảo trợ. Tôi đã tắt tối ưu hóa ngay bây giờ và đã cố gắng hết sức để làm cho nó bị lỗi một lần nữa - điều này xảy ra trong khi kéo và thả trên một ảnh nhỏ, đặc biệt khi màn hình cảm ứng gửi vị trí hài hước khi bạn nhả ngón tay, dễ dàng để tự động hóa! Khó tái sản xuất ngay từ đầu. Hy vọng rằng một coredump không tối ưu hóa sẽ hiển thị một số kết quả hữu ích hơn. Hấp dẫn. Vì vậy, trong lý thuyết tôi có thể tìm ra 'cái này' được cho là gì nếu tôi kiểm tra bộ lắp ráp trong coredump và nhìn vào thanh ghi - nhưng điều đó có lẽ sẽ không hữu ích. – xwhatsit