首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC Release 版閃退調試:c0000005 訪問違規完整排查指南

     編輯:程式設計綜合問答

異常信息解讀

Sig[6].Value=c0000005  // STATUS_ACCESS_VIOLATION
Sig[7].Value=00001d2a  // 異常偏移地址

經典空指針解引用或野指針訪問特徵。

VS 調試 vs 直接運行差異根因

環境記憶體佈局未初始化變量值表現
VS Debug調試堆填充 0xCD/0xFD確定性非零可能偶然正常
VS Release優化後佈局隨機垃圾值不確定性崩潰
直接運行標準堆全零或隨機穩定崩潰

系統性排查步驟

1. 啟用 Dr. Watson / WER 獲取完整傾印

// 代碼中添加崩潰傾印生成
#include 
#pragma comment(lib, "DbgHelp.lib")

LONG WINAPI MyCrashHandler(EXCEPTION_POINTERS* pExp) {
    MINIDUMP_EXCEPTION_INFORMATION mei;
    mei.ThreadId = GetCurrentThreadId();
    mei.ExceptionPointers = pExp;
    mei.ClientPointers = FALSE;
    
    HANDLE hFile = CreateFile(_T("crash.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mei, NULL, NULL);
    CloseHandle(hFile);
    return EXCEPTION_EXECUTE_HANDLER;
}

// 程序入口設置
SetUnhandledExceptionFilter(MyCrashHandler);

2. 重點檢查 InitDialog 及控件綁定

  • DDX_Control 對應控件 ID 是否存在
  • 子對話框指針是否正確創建/銷毀
  • 動態創建控件 Create() 返回值檢查

3. 變量初始化檢查清單

// 悪習
CString str;        // 未初始化
int* p = new int;   // 未初始化
// 好習慣
CString str = _T("");
int* p = new int(0);
int arr[10] = {0};

4. 使用 AddressSanitizer (VS2019+)

項目屬性 → C/C++ → General → Enable Address Sanitizer: Yes

實戰案例:局部變量未初始化

// 錯誤代碼
void CMyDialog::OnButtonClick() {
    CRect rect;           // 未初始化!
    GetClientRect(&rect); // 輸出參數,但若函數失敗 rect 含垃圾值
    // 後續使用 rect 導致崩潰
}

// 正確代碼
void CMyDialog::OnButtonClick() {
    CRect rect = {0};     // 零初始化
    if (GetClientRect(&rect)) {
        // 安全使用
    }
}
錯誤對話框 閃退截圖 VS調試效果 直接運行效果
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved