Tôi đang sử dụng đoạn mã sau để tạo ra một tập tin minidump bất cứ khi nào có một ngoại lệ có cấu trúc được tạo ra từ mã của tôi:Tạo minidump cho ngoại lệ truy cập vi phạm sử dụng SetUnhandledExceptionFilter()
void CreateMiniDump(EXCEPTION_POINTERS* pep)
{
// Open the file
typedef BOOL (*PDUMPFN)(
HANDLE hProcess,
DWORD ProcessId,
HANDLE hFile,
MINIDUMP_TYPE DumpType,
PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
PMINIDUMP_CALLBACK_INFORMATION CallbackParam
);
HANDLE hFile = CreateFile(_T("C:/temp/MiniDump.dmp"), GENERIC_READ | GENERIC_WRITE,
0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
HMODULE h = ::LoadLibrary(L"DbgHelp.dll");
PDUMPFN pFn = (PDUMPFN)GetProcAddress(h, "MiniDumpWriteDump");
if((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
{
// Create the minidump
MINIDUMP_EXCEPTION_INFORMATION mdei;
mdei.ThreadId = GetCurrentThreadId();
mdei.ExceptionPointers = pep;
mdei.ClientPointers = TRUE;
MINIDUMP_TYPE mdt = MiniDumpNormal;
BOOL rv = (*pFn)(GetCurrentProcess(), GetCurrentProcessId(),
hFile, mdt, (pep != 0) ? &mdei : 0, 0, 0);
// Close the file
CloseHandle(hFile);
}
}
LONG WINAPI MyUnhandledExceptionFilter(
struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
CreateMiniDump(ExceptionInfo);
return EXCEPTION_EXECUTE_HANDLER;
}
Và tôi đang làm SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
từ chính điểm vào của ứng dụng của tôi (tôi không thiết lập nó cho mỗi thread mặc dù). Sau này để kiểm tra mã này tôi đã làm như sau để tạo ra một sự vi phạm truy cập: int* p = 0; *p = 0;
Tệp kết xuất đã được tạo. Sau đó, tôi đã sử dụng windbg và mở tệp kết xuất và sử dụng lệnh .ecxr
để nhận được bản ghi ngoại lệ. Tuy nhiên, không có thông tin nào đến đó (tức là tôi không nhận được ngăn xếp cuộc gọi). Ngoài ra nếu tôi sử dụng lệnh !analyze -v
thì nó có thể hiển thị dòng nơi xảy ra sự cố. Có ai biết những gì tôi đang thiếu và làm thế nào để giải quyết điều này?
BTW, tôi đang sử dụng trình biên dịch VC7 với cờ/EHa (mô hình ngoại lệ asynchronuos).
Tôi không có câu trả lời cho bạn, nhưng tôi không hoàn toàn chắc chắn rằng 'mdei.ClientPointers' thực sự phải là' TRUE' – Hasturkun
@Hasturkun: Tôi đã thử cả hai, không tạo ra bất kỳ sự khác biệt nào. – Naveen
Lưu ý rằng các trình xử lý được cài đặt bằng cách sử dụng SetUnhandledExceptionFilter(), bởi kinh nghiệm của tôi sẽ không được gọi trong mọi trường hợp. I E.sự cố trong Windows kernel Dll (đôi khi xảy ra rõ ràng) chỉ có thể được báo cáo bằng cách sử dụng Windows Error Reporting. Xem bài viết của tôi "Post Mortem Debuugging revisited" trên DDJ http://www.drdobbs.com/architecture-and-design/227900186 –