2008-10-22 10 views
14

Tôi hiện đang chụp MiniDumps của các ngoại lệ chưa được xử lý bằng cách sử dụng SetUnhandledExceptionFilter tuy nhiên đôi khi tôi nhận được "R6025: chức năng ảo thuần túy".Chụp R6025 cuộc gọi ảo thuần túy

Tôi hiểu làm thế nào một cuộc gọi chức năng ảo tinh khiết xảy ra Tôi chỉ tự hỏi nếu nó có thể nắm bắt chúng để tôi có thể tạo một MiniDump tại thời điểm đó.

Trả lời

15

Nếu bạn muốn bắt tất cả các tai nạn bạn phải làm nhiều hơn là chỉ: SetUnhandledExceptionFilter

Tôi cũng sẽ thiết lập xử lý hủy bỏ, xử lý purecall, bất ngờ, chấm dứt, và xử lý tham số không hợp lệ.

#include <signal.h> 

inline void signal_handler(int) 
{ 
    terminator(); 
} 

inline void terminator() 
{ 
    int*z = 0; *z=13; 
} 

inline void __cdecl invalid_parameter_handler(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t) 
{ 
    terminator(); 
} 

Và trong đặt chính của bạn này:

signal(SIGABRT, signal_handler); 
_set_abort_behavior(0, _WRITE_ABORT_MSG|_CALL_REPORTFAULT); 

set_terminate(&terminator); 
set_unexpected(&terminator); 
_set_purecall_handler(&terminator); 
_set_invalid_parameter_handler(&invalid_parameter_handler); 

trên sẽ gửi tất cả các tai nạn để xử lý ngoại lệ unhandled của bạn.

11

Xem this answer here cho câu hỏi where do “pure virtual function call” crashes come from?.

Để giúp gỡ rối các loại vấn đề bạn có thể, trong các phiên bản khác nhau của MSVC, thay thế xử lý purecall thư viện thời gian chạy của. Bạn làm điều này bằng cung cấp chức năng của riêng bạn với chữ ký này:

int __cdecl _purecall(void) 

và liên kết nó trước khi bạn liên kết thời gian chạy thư viện. Điều này cho phép bạn kiểm soát số điều gì sẽ xảy ra khi một máy dọn dẹp được phát hiện . Khi bạn có quyền kiểm soát, bạn có thể làm điều gì đó hữu ích hơn trình xử lý tiêu chuẩn . Tôi có một người xử lý có thể cung cấp một dấu vết ngăn xếp của nơi xảy ra sự thanh trừng; xem tại đây: http://www.lenholgate.com/archives/000623.html để biết thêm chi tiết.

(Lưu ý bạn cũng có thể gọi _set_purecall_handler() để cài đặt trình xử lý của bạn trong một số phiên bản MSVC).

Vì vậy, trong trình xử lý trong thiết bị của bạn, hãy thực hiện minidump của bạn.

-1

Hãy thử xác định ảo tinh vi vi phạm. Không có gì trong quy tắc C++ cấm bạn định nghĩa một virtual thuần túy, và bạn có thể sử dụng nó vì một số lý do, ít nhất trong số đó là nhận được backtrace trong cuộc gọi. Caviat duy nhất là định nghĩa phải nằm ngoài tuyên bố (virtual void bla() = 0 { } không hợp lệ).