青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
VC++ Runtime Error 異常捕獲之不掛的程序

 很多軟件通過(guò)設(shè)置自己的異常捕獲函數(shù),捕獲未處理的異常,生成報(bào)告或者日志(例如生成mini-dump文件),達(dá)到Release版本下追蹤Bug的目的。但是,到了VS2005(即VC8),Microsoft對(duì)CRT(C運(yùn)行時(shí)庫(kù))的一些與安全相關(guān)的代碼做了些改動(dòng),典型的,例如增加了對(duì)緩沖溢出的檢查。新CRT版本在出現(xiàn)錯(cuò)誤時(shí)強(qiáng)制把異常拋給默認(rèn)的調(diào)試器(如果沒(méi)有配置的話,默認(rèn)是Dr.Watson),而不再通知應(yīng)用程序設(shè)置的異常捕獲函數(shù),這種行為主要在以下三種情況出現(xiàn)。

(1)       調(diào)用abort函數(shù),并且設(shè)置了_CALL_REPORTFAULT選項(xiàng)(這個(gè)選項(xiàng)在Release版本是默認(rèn)設(shè)置的)。

(2)       啟用了運(yùn)行時(shí)安全檢查選項(xiàng),并且在軟件運(yùn)行時(shí)檢查出安全性錯(cuò)誤,例如出現(xiàn)緩存溢出。(安全檢查選項(xiàng)/GS 默認(rèn)也是打開的)

(3)       遇到_invalid_parameter錯(cuò)誤,而應(yīng)用程序又沒(méi)有主動(dòng)調(diào)用

_set_invalid_parameter_handler設(shè)置錯(cuò)誤捕獲函數(shù)。

所以結(jié)論是,使用VS2005(VC8)編譯的程序,許多錯(cuò)誤都不能在SetUnhandledExceptionFilter捕獲到。這是CRT相對(duì)于前面版本的一個(gè)比較大的改變,但是很遺憾,Microsoft卻沒(méi)有在相應(yīng)的文檔明確指出。

解決方法

       之所以應(yīng)用程序捕獲不到那些異常,原因是因?yàn)樾掳姹镜腃RT實(shí)現(xiàn)在異常處理中強(qiáng)制刪除所有應(yīng)用程序先前設(shè)置的捕獲函數(shù),如下所示:

 /* Make sure any filter already in place is deleted. */

 SetUnhandledExceptionFilter(NULL);

 UnhandledExceptionFilter(&ExceptionPointers);

解決方法是攔截CRT調(diào)用SetUnhandledExceptionFilter函數(shù),使之無(wú)效。在X86平臺(tái)下,可以使用以下代碼。

#ifndef _M_IX86

       #error "The following code only works for x86!"

#endif

 

void DisableSetUnhandledExceptionFilter()

{

    void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),

                                                         "SetUnhandledExceptionFilter");

    if (addr)

    {

              unsigned char code[16];

              int size = 0;

              code[size++] = 0x33;

              code[size++] = 0xC0;

              code[size++] = 0xC2;

              code[size++] = 0x04;

              code[size++] = 0x00;

 

               DWORD dwOldFlag, dwTempFlag;

              VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);

              WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);

              VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

       }

}

在設(shè)置自己的異常處理函數(shù)后,調(diào)用DisableSetUnhandledExceptionFilter禁止CRT設(shè)置即可。

其它討論

       上面通過(guò)設(shè)置api hook,解決了在VS2005上的異常捕獲問(wèn)題,這種雖然不是那么“干凈”的解決方案,確是目前唯一簡(jiǎn)單有效的方式。

       雖然也可以通過(guò)_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...), 和_set_invalid_parameter_handler(...) 解決(1)(3),但是對(duì)于(2),設(shè)置api hook是唯一的方式。

注:對(duì)于錯(cuò)誤是否顯示錯(cuò)誤提示框,可以使用SetErrorMode()


后面又遇到WIN8.1上
VirtualProtect報(bào)錯(cuò)C0000005,最后還是想辦法解決了

bool AdjustPrivileges() 
{     
    HANDLE hToken;     
    TOKEN_PRIVILEGES tp;     
    TOKEN_PRIVILEGES oldtp;     
    DWORD dwSize=sizeof(TOKEN_PRIVILEGES);     
    LUID luid;       
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
    {         
        if (GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) return true;         
        else return false;     
    }     

    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) 
    {        
        CloseHandle(hToken);         
        return false;     
    }     
    
    ZeroMemory(&tp, sizeof(tp));     
    tp.PrivilegeCount=1;     
    tp.Privileges[0].Luid=luid;     
    tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;     
    /* Adjust Token Privileges */    
    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &oldtp, &dwSize)) 
    {        
        CloseHandle(hToken);         
        return false;     
    }     
    
    // close handles     
    CloseHandle(hToken);     
    return true



void DisableSetUnhandledExceptionFilter()

{

    void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),

        "SetUnhandledExceptionFilter");

    if (addr)

    {

        unsigned char code[16];

        int size = 0;

        code[size++] = 0x33;

        code[size++] = 0xC0;

        code[size++] = 0xC2;

        code[size++] = 0x04;

        code[size++] = 0x00;

        //SetProcessDEPPolicy(1);

        DWORD dwOldFlag, dwTempFlag;

        // win8.1下用百度找了下PAGE_READWRITE崩潰,實(shí)際測(cè)試提升debug權(quán)限,SetProcessDEPPolicy(1);都無(wú)效,改成PAGE_EXECUTE_READWRITE生效
        
//VirtualProtect(addr, size, PAGE_READWRITE, &dwOldFlag);
        VirtualProtect(addr, size, PAGE_EXECUTE_READWRITE, &dwOldFlag);
        WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);

        VirtualProtect(addr, size, dwOldFlag, &dwTempFlag);

    }

}



posted on 2015-08-28 11:14 Enic 閱讀(728) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 從零開始寫棋牌游戲平臺(tái)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品九九| 久久字幕精品一区| 久久久久久久一区二区| 亚洲欧美日韩国产综合| 亚洲女女做受ⅹxx高潮| 午夜精品一区二区三区四区 | 欧美成人xxx| 亚洲免费黄色| 亚洲香蕉视频| 欧美专区亚洲专区| 另类春色校园亚洲| 亚洲国产日日夜夜| 亚洲第一久久影院| 一区二区欧美日韩视频| 亚洲一区二区在线播放| 久久精品在这里| 欧美精品一区二区在线观看| 欧美视频在线观看| 欧美中文字幕久久| 欧美经典一区二区| 国产精品资源| 亚洲精品裸体| 欧美中文在线视频| 亚洲人成网站777色婷婷| 亚洲欧美乱综合| 欧美另类一区二区三区| 国产一区二区视频在线观看| 久久婷婷丁香| 亚洲精品久久久蜜桃 | 久久免费黄色| 欧美日韩直播| 亚洲国产成人久久综合| 亚洲午夜精品久久久久久app| 一区二区三区欧美| 美国十次成人| 小黄鸭视频精品导航| 欧美人在线视频| 在线日韩一区二区| 久久av资源网| 亚洲欧洲一区二区在线观看| 欧美一区网站| 欧美无砖砖区免费| 欧美a级片网站| 国产在线视频欧美| 欧美aaa级| 在线看欧美视频| 久久激情视频久久| 亚洲视频香蕉人妖| 欧美日韩日韩| 日韩一级精品视频在线观看| 久久男人av资源网站| 亚洲网友自拍| 久久久国产亚洲精品| 久久疯狂做爰流白浆xx| 亚洲一区国产精品| 国产精品福利网| 亚洲在线观看视频| 国产精品99久久久久久www| 欧美日本在线观看| 亚洲美女视频在线免费观看| 免费精品视频| 亚洲一区图片| 国产日韩亚洲欧美精品| 午夜精品偷拍| 欧美在线日韩在线| 黄色成人91| 欧美大片一区| 欧美成人r级一区二区三区| 亚洲激情电影在线| 夜夜爽av福利精品导航| 亚洲美女电影在线| 国产精品乱子乱xxxx| 欧美在线一二三区| 欧美在线观看你懂的| 精品av久久707| 欧美激情在线狂野欧美精品| 欧美mv日韩mv亚洲| 亚洲午夜精品福利| 欧美一二区视频| 亚洲国产一区二区精品专区| 性做久久久久久久久| 狠狠v欧美v日韩v亚洲ⅴ| 麻豆久久精品| 欧美日韩免费观看一区=区三区| 在线性视频日韩欧美| 一区二区日韩免费看| 国产日韩欧美高清免费| 欧美黄色一级视频| 欧美午夜在线| 蜜臀av一级做a爰片久久| 亚洲网在线观看| 一本色道久久综合亚洲精品婷婷| 夜夜精品视频| 一色屋精品视频在线看| 亚洲人妖在线| 国产一级揄自揄精品视频| 亚洲第一久久影院| 久久av最新网址| 99这里只有精品| 久久国产色av| 在线综合欧美| 久久免费高清视频| 欧美一级视频精品观看| 欧美不卡在线视频| 久久精品99国产精品日本| 亚洲激情视频在线观看| 国产精品一区在线观看| 农村妇女精品| 99国产精品国产精品久久| 夜夜嗨av一区二区三区| 亚洲国产福利在线| 性18欧美另类| 亚洲欧美高清| 欧美理论大片| 欧美激情久久久久久| 国产视频在线观看一区| 9久草视频在线视频精品| 亚洲国产视频一区二区| 欧美中文在线观看国产| 亚洲一区二区三区四区五区午夜 | 国产日韩成人精品| 91久久中文字幕| 在线看视频不卡| 欧美一级二级三级蜜桃| 欧美日韩高清不卡| 亚洲国产国产亚洲一二三| 一区免费视频| 久久九九99| 另类综合日韩欧美亚洲| 国产香蕉久久精品综合网| 亚洲私人黄色宅男| 亚洲伊人观看| 国产精品sm| 中文亚洲视频在线| 亚洲自拍另类| 国产在线国偷精品产拍免费yy| 亚洲精品午夜| 日韩视频中文字幕| 欧美大片va欧美在线播放| 猛男gaygay欧美视频| 狠狠久久亚洲欧美专区| 久久精品亚洲国产奇米99| 久久免费视频在线观看| 国产一区二区主播在线| 香蕉久久一区二区不卡无毒影院| 欧美在线三级| 国产色视频一区| 久久精品视频va| 欧美大片在线观看一区二区| 亚洲第一在线视频| 欧美成人精品在线观看| 91久久精品国产91久久性色| 精品福利免费观看| 欧美制服丝袜第一页| 亚洲国产精品久久久久婷婷老年 | 国产精品二区在线观看| 亚洲精品网站在线播放gif| 一道本一区二区| 欧美新色视频| 午夜精品影院在线观看| 久久蜜桃av一区精品变态类天堂| 激情一区二区| 欧美电影免费观看网站| 久久精品一区二区三区不卡牛牛 | 国产精品激情av在线播放| 最新国产の精品合集bt伙计| 99国产精品99久久久久久粉嫩| 欧美日韩精品免费在线观看视频| 亚洲精品中文字幕在线| 亚洲欧美日韩国产另类专区| 国产一区二区三区久久久| 免费观看一区| 香蕉成人啪国产精品视频综合网| 亚洲第一中文字幕在线观看| 亚洲欧美日韩一区在线| 雨宫琴音一区二区在线| 欧美色图麻豆| 一区在线免费观看| 亚洲青色在线| 国产一区亚洲| 欧美日韩国产综合一区二区| 欧美一级大片在线免费观看| 亚洲人体一区| 美女精品自拍一二三四| 亚洲在线一区二区三区| 亚洲黄页一区| 红桃av永久久久| 国产精品久久婷婷六月丁香| 欧美日韩亚洲一区二| 亚洲精品在线视频| 国产欧美激情| 欧美了一区在线观看| 久久久久久久一区| 麻豆成人小视频| 欧美一区二区三区视频| 一区二区三区 在线观看视| 亚洲国产小视频| 牛夜精品久久久久久久99黑人 | 亚洲电影免费在线| 久久精品中文字幕免费mv|