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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

也談Release版本排錯

通常Release除錯都是先通過SetUnhandledExceptionFilter捕獲異常,然后生成報告文件,最后定位代碼行,主要以下兩種方法:

(一)通過遍歷調用棧,將其調用棧信息輸出到文件。然后查找出錯地址。

查找方式有兩種:

1)通過編譯器生成的包含行信息的map文件定位出錯位置。

通過在工程屬性”-“link”-“Project Options”手工輸入 /mapinfo:lines,生成包含行信息map文件。查找時首先根據出錯地址范圍找到obj文件名,查看obj文件對應的行信息,根據出錯地址范圍定位代碼行。

2)通過編譯器生成的pdb文件定位出錯位置。

debug版本會自動生成pdb文件,Release版本需要在工程屬性”-“link”面板中勾上選項“Generate debug info”,然后在工程屬性” -“C/C++”面板的“Debug Info”列表框選中“Program Database”

pdb文件中查找出錯地址所在的代碼行,需要通過dbghelp庫(包含在windbg目錄下),通過SymFromAddr函數可以獲取符號信息,SymGetLineFromAddr64獲取所在代碼行。

遍歷調用棧方法方法也有兩種:

1)自己遍歷調用棧

這種方法的缺陷是Release版本通常會使用FPOFrame-Pointer Omisstion) 優化,(注:在VC編譯器中可以在工程屬性”—> C/C++”—>“Project Options中去掉選項Oy-關閉PFO優化),PFO優化主要是通過省略調用時棧指針的保存恢復等操作提高代碼效率。下面自己遍歷調用棧的方法對采用了FPO優化的模塊可能會遍歷不完全,遺漏掉一些函數。因此,即使自己的模塊關閉了FPO,但第三方模塊使用了FPO,如果報錯的地址位于第三方dll內(例如mfc42.dll),將有可能回溯不到自己模塊內有問題的函數,從而很難定位bug

自己遍歷基于以下原理(這個原理只適用于沒有采用FPO優化的函數):

    1 函數調用時call指令將返回地址(通常是下一條指令的地址)壓入堆棧 。

    2 函數運行第一行會將 ebp壓入堆棧,保存它以使得當函數返回能恢復ebp

    3 Copy當前棧位置esp ebp

4.然后esp自減以空出棧空間容納函數的局部變量

因此當前函數內的ebp即為第2步壓入ebp后的棧頂位置,由此可推導出上一層函數的ebp[ebp],而上一層函數返回地址即為前一個壓入棧的值,即[ebp+4],由此可以一步步往上回溯調用棧。

2)通過dbghelp庫函數StackWalk64遍歷堆棧。

這種方式可以選擇是否加載pdb,對于做了那些被FPO優化的函數,pdb保存了相關數據來幫助遍歷調用棧,如果不能加載到正確的pdbStackWalk64將使用前面介紹的基于ebp的方式遍歷調用棧,從而漏掉那些被FPO優化的函數。

(二)通過生成mini dump文件定位bug

通過dbghelp庫函數MiniDumpWriteDump將出錯時信息寫入文件,然后用windbg打開dump文件,配置好symbols路徑,exe文件路徑,source code 路徑,輸入.ecxr命令,就可以查看詳細的調用棧,并能自動打開源文件定位到代碼行。因此這種方法是簡單和最可靠的方法。

下面是一個簡單的dume類,只要添入到工程即可,出錯時會自動生成dum文件。

#include <windows.h>

#include <tchar.h>

#include <assert.h>

//for VC6

#ifndef __in_bcount_opt

#define __in_bcount_opt(x)

#endif

#ifndef __out_bcount_opt

#define __out_bcount_opt(x)

#endif

//end (for VC6)

#include "dbghelp.h"

typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(

 IN HANDLE hProcess,

 IN DWORD ProcessId,

 IN HANDLE hFile,

 IN MINIDUMP_TYPE DumpType,

 IN CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, OPTIONAL

 IN CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, OPTIONAL

 IN CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam OPTIONAL

 );

class CMiniDumper

{

public:

CMiniDumper();

private:

static LPTOP_LEVEL_EXCEPTION_FILTER s_pPrevFilter;

static long WINAPI UnhandledExceptionFilter( struct _EXCEPTION_POINTERS *pExceptionInfo );

};

CMiniDumper g_minObject;

LPTOP_LEVEL_EXCEPTION_FILTER CMiniDumper::s_pPrevFilter = 0;

CMiniDumper::CMiniDumper()

{

assert(!s_pPrevFilter);

s_pPrevFilter = ::SetUnhandledExceptionFilter(UnhandledExceptionFilter);

}

long CMiniDumper::UnhandledExceptionFilter( struct _EXCEPTION_POINTERS *pExceptionInfo )

{

long ret = EXCEPTION_CONTINUE_SEARCH;

TCHAR szDbgHelpPath[_MAX_PATH] = {0};

TCHAR szDumpPath[_MAX_PATH] = {0};

TCHAR szPath[_MAX_PATH] = {0};

if (GetModuleFileName(NULL, szPath, _MAX_PATH))

{

TCHAR szDrive[_MAX_DRIVE] = {0};

TCHAR szDir[_MAX_DIR] = {0};

TCHAR szFileName[_MAX_FNAME] = {0};

_tsplitpath(szPath, szDrive, szDir, szFileName, 0);

_tcsncat(szDbgHelpPath, szDrive, _MAX_PATH);

_tcsncat(szDbgHelpPath, szDir, _MAX_PATH - _tcslen(szDbgHelpPath) - 1);

_tcsncat(szDbgHelpPath, _T("dbghelp.dll"), _MAX_PATH - _tcslen(szDbgHelpPath) - 1);

_tcsncat(szDumpPath, szDrive, _MAX_PATH);

_tcsncat(szDumpPath, szDir, _MAX_PATH - _tcslen(szDumpPath) - 1);

_tcsncat(szDumpPath, szFileName, _MAX_PATH - _tcslen(szDumpPath) - 1);

_tcsncat(szDumpPath, _T(".dmp"), _MAX_PATH - _tcslen(szDumpPath) - 1);

}

HMODULE hDll = ::LoadLibrary(szDbgHelpPath);

if (hDll==NULL)

hDll = ::LoadLibrary(_T("dbghelp.dll"));

assert(hDll);

if (hDll)

{

MINIDUMPWRITEDUMP pWriteDumpFun = (MINIDUMPWRITEDUMP)::GetProcAddress(hDll, "MiniDumpWriteDump");

if (pWriteDumpFun)

{

// create the file

HANDLE hFile = ::CreateFile(szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile != INVALID_HANDLE_VALUE)

{

_MINIDUMP_EXCEPTION_INFORMATION ExInfo;

ExInfo.ThreadId = ::GetCurrentThreadId();

ExInfo.ExceptionPointers = pExceptionInfo;

ExInfo.ClientPointers = FALSE;

// write the dump

if (pWriteDumpFun(GetCurrentProcess(), GetCurrentProcessId(),

hFile, MiniDumpNormal, pExceptionInfo!=0? &ExInfo: 0, NULL, NULL))

ret = EXCEPTION_EXECUTE_HANDLER;

::CloseHandle(hFile);

}

}

}

if (s_pPrevFilter)

ret = s_pPrevFilter(pExceptionInfo);

return ret;

}

 

posted on 2009-10-22 19:28 肥仔 閱讀(2128) 評論(0)  編輯 收藏 引用 所屬分類: 調試

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品性做久久久久久| 亚洲欧美激情精品一区二区| 在线中文字幕一区| 性亚洲最疯狂xxxx高清| 国内免费精品永久在线视频| 欧美午夜不卡视频| 欧美日韩亚洲成人| 久久综合九色综合久99| 久久福利毛片| 久久九九热re6这里有精品| 日韩亚洲一区二区| 亚洲欧美日韩一区二区三区在线观看 | 欧美日韩免费网站| 欧美电影免费| 欧美日韩在线观看一区二区| 国产乱人伦精品一区二区| 国产在线成人| 曰韩精品一区二区| 久久亚洲精品一区| 在线看国产日韩| 欧美韩日一区| 欧美制服丝袜| 国产精品制服诱惑| 欧美一区国产二区| 99伊人成综合| 欧美日韩精品综合在线| 亚洲人体1000| 亚洲三级电影在线观看| 久久久一区二区三区| 国产精品久久久久久久久免费| 日韩视频精品在线| 日韩视频―中文字幕| 国产精品久久国产愉拍| 欧美一区二区三区免费视| 亚洲在线观看| 国外成人免费视频| 免费观看亚洲视频大全| 毛片基地黄久久久久久天堂| 亚洲高清不卡一区| 最新日韩av| 国产精品亚洲激情| 猛男gaygay欧美视频| 欧美好吊妞视频| 欧美制服第一页| 欧美成人一品| 久久久精品五月天| 欧美成在线观看| 久久精品亚洲精品| 欧美日韩国语| 亚洲高清色综合| 国产精品一区二区久久久| 欧美韩国日本综合| 国产亚洲人成网站在线观看| 美女诱惑一区| 亚洲午夜女主播在线直播| 欧美中文在线观看| 一区二区三区精品国产| 久久精品视频免费| 欧美一区二区三区免费大片| 国产精品国产自产拍高清av王其 | 猛男gaygay欧美视频| 久久精彩免费视频| 欧美日韩一区二区视频在线| 最新日韩在线| 国产精品99久久久久久久女警 | 欧美人成网站| 一区二区三区**美女毛片| 亚洲欧美激情视频| 国产精品成人播放| 日韩一级在线| 老牛影视一区二区三区| 亚洲一区二区三区乱码aⅴ| 久久国内精品视频| 亚洲国内自拍| 欧美日本韩国一区| 99日韩精品| 久色婷婷小香蕉久久| 亚洲精品美女在线| 国产精品毛片a∨一区二区三区| 亚洲欧美精品一区| 亚洲国产日韩美| 亚洲视频免费在线| 欧美日韩精品免费观看视频完整| 一本色道久久88综合日韩精品| 欧美制服丝袜第一页| 亚洲美女少妇无套啪啪呻吟| 久久久久久夜精品精品免费| 亚洲夫妻自拍| 亚洲一区尤物| 亚洲精品国产系列| 狠狠色丁香婷婷综合| 欧美怡红院视频一区二区三区| 亚洲精品欧美日韩专区| 国产三级欧美三级日产三级99| 欧美久久在线| 欧美日韩成人精品| 美女精品在线| 亚洲一区二区高清| 亚洲欧洲一区二区三区久久| 久久激情视频免费观看| 一区二区三区四区五区精品视频| 国产美女一区二区| 国产精品视频免费观看| 欧美日韩免费在线观看| 牛牛影视久久网| 一区二区三区欧美| 亚洲美女免费精品视频在线观看| 午夜精品美女久久久久av福利| 黄色成人av| 国产一区二区福利| 国产精品va在线播放| 欧美高清视频一区二区| 美女91精品| 欧美日韩国产色综合一二三四| 麻豆精品视频在线| 免费亚洲网站| 欧美激情久久久久| 欧美日韩精品欧美日韩精品 | 午夜视频在线观看一区| 亚洲午夜精品一区二区| 亚洲一区尤物| 亚洲午夜久久久久久尤物 | 亚洲欧美春色| 亚洲欧美日韩综合国产aⅴ| 一本色道久久综合狠狠躁的推荐| 亚洲美女视频网| 午夜精品一区二区三区四区| 欧美亚洲一区在线| 欧美激情综合色| 亚洲综合久久久久| 欧美日韩成人综合在线一区二区| 欧美三区美女| 亚洲国产午夜| 欧美一区二区三区日韩| 亚洲电影免费在线 | 亚洲卡通欧美制服中文| 亚洲欧美日韩国产中文在线| 欧美a一区二区| 国产午夜一区二区三区| 亚洲一区二区三区涩| 老司机凹凸av亚洲导航| 狠狠色综合一区二区| 亚洲一区免费视频| 亚洲人体偷拍| 欧美激情亚洲综合一区| 亚洲第一级黄色片| 久久精品成人欧美大片古装| 亚洲图片欧美午夜| 欧美日韩一区二区精品| 亚洲人妖在线| 亚洲国产婷婷香蕉久久久久久| 欧美一区二区三区免费在线看| 国产农村妇女精品一二区| 亚洲桃色在线一区| 一区二区三区**美女毛片| 国产精品国产精品国产专区不蜜| 国产精品99久久久久久人| 亚洲在线观看| 国产精品综合久久久| 欧美在线黄色| 亚洲精品久久视频| 亚洲欧美日韩一区二区在线 | 蜜臀a∨国产成人精品| 欧美欧美午夜aⅴ在线观看| 亚洲激情另类| 欧美成人午夜影院| 欧美日韩一区在线视频| 99精品视频免费全部在线| 国产精品国产自产拍高清av王其| 亚洲欧美在线一区| 久久久久久91香蕉国产| 一区二区毛片| 久久精品国产免费| 亚洲综合999| 久久久久久久91| 亚洲最新视频在线播放| 欧美在线网站| 日韩一区二区精品在线观看| 亚洲永久视频| 亚洲午夜久久久久久尤物| 久久精品欧美| 性欧美xxxx视频在线观看| 欧美日韩三级视频| 亚洲国产精品va| 激情欧美国产欧美| 午夜一区二区三区在线观看| 亚洲欧美日韩综合| 亚洲一区二区三区精品在线 | 国产欧美日韩综合| 一区二区三区四区精品| 91久久精品美女| 欧美福利精品| 欧美一区二区三区免费看| 欧美韩日视频| 国产精品卡一卡二| 一本久道久久综合中文字幕| 日韩视频一区二区| 欧美日韩成人综合在线一区二区| 欧美不卡视频| 国精产品99永久一区一区|