国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

介紹一個(gè)專門處理C++異常的類和例子

2019-11-17 05:34:39
字體:
供稿:網(wǎng)友

下載源代碼和例子


簡介:

CExceptionLogger,是一個(gè)可以免費(fèi)使用的C++類,用它可以截獲未處理異常,如:非法存取、棧溢出、被零除等,并可以將異常具體信息記錄到日志文件。這個(gè)類源自于MSDN Magazine 2002年3月的一篇專欄文章“Under the Hood: ImPRoved Error Reporting with DBGHELP 5.1”,該文章的作者是 Matt Pietrek。

特性:

在默認(rèn)情況下,CExceptionLogger產(chǎn)生一個(gè)日志文件,名字為:nameofexe.exception,這里的nameofexe是exe文件的名字。假如以ASCII模式生成CExceptionLogger,則日志文件為一ASCII文件;假如以UNICODE模式生成CExceptionLogger,那么日志文件為一UNICODE文件。日志文件記錄的信息包括:
  1. 記錄異常發(fā)生的日期和時(shí)間。
  2. 異常代碼。
  3. 假如發(fā)生非法存取,則記錄該異常的具體信息。
  4. 記錄的異常具體信息包括:線性地址、段、偏移量和模塊路徑。
  5. 進(jìn)程的全路徑名。
  6. 當(dāng)前Win32工作目錄。
  7. 進(jìn)程的命令行。
  8. 進(jìn)程ID。
  9. 發(fā)生異常的線程ID。
  10. 列舉進(jìn)程中所有的線程(假設(shè)ToolHelp32是可獲得的),內(nèi)容包括:
    • 線程ID
    • 優(yōu)先級和Delta優(yōu)先級
    • 參考
    • 創(chuàng)建時(shí)間
    • Kernel 和 User Time
  11. 列舉進(jìn)程中的模塊(同樣假設(shè)ToolHelp32是可獲得的),內(nèi)容包括:
    • 名字和全路徑
    • 全程及每個(gè)進(jìn)程的引用計(jì)數(shù)
    • 模塊句柄
    • 大小
    • 模塊完全展開后的所有符號
  12. 所有x86寄存器。
  13. 異常發(fā)生的調(diào)用堆棧,包括:段、偏移量、模塊、函數(shù)和行信息。
  14. 日志文件記錄的內(nèi)容還包括每一個(gè)堆棧幀(stack frame)以及所有模塊、所有變量、所有參數(shù);所有基本數(shù)據(jù)類型,如:voids, chars, shorts, Words, ints, DWORDS, floats, doubles 和 longs。此外日志還記錄用戶定義的數(shù)據(jù)類型(UDT)包括結(jié)構(gòu)、聯(lián)合以及類的信息,再現(xiàn)其成員數(shù)據(jù)。每種類型都包括名字、地址、類型和值。假如變量是一數(shù)組,該數(shù)組中的值被完全記錄。
版權(quán)聲明:
  • 你可以在任何以二進(jìn)制形式發(fā)布的產(chǎn)品(包括商業(yè)的、共享的、自由的或其它的)中包含此源代碼
  • 在不修改每個(gè)模塊(*.h、*.cpp)最上方版權(quán)細(xì)則的前提下,你可以用任何方式修改源代碼
  • 假如你想要與自己的應(yīng)用程序一起分發(fā)源代碼,只答應(yīng)分發(fā)作者最新發(fā)布的版本,以便保證源代碼的出處是唯一的
使用方法:
  • 編譯這個(gè)類需要安裝2002年11月以后發(fā)布的平臺SDK。使用時(shí)既可以將 ExceptHandler.cpp/h 文件直接添加到C++工程中,也可以用DLL輸出異常處理函數(shù)類,并用LoadLibrary函數(shù)在需要時(shí)動態(tài)加載DLL。
  • ExceptHandler的二進(jìn)制版本在XCPTHLR.DLL中提供。此DLL可以從本文最上方鏈接處下載。
  • 為了在客戶機(jī)器上運(yùn)行該代碼,必須分發(fā)DBGHELP 5.1 動態(tài)鏈接庫,這個(gè)庫可以從2002年11月以后的平臺SDK中獲得。選擇“Install Debugging Tools for Windows”選項(xiàng)安裝該DLL。此外,還要注重DBGHELP 動態(tài)鏈接庫在最新的 Windows 版本中是受到保護(hù) Windows 系統(tǒng)文件,所以請將 DBGHELP 動態(tài)鏈接庫放在與應(yīng)用程序相同的目錄中。
  • 為了在release模式中給代碼提供符號,必須按照下列步驟修改工程設(shè)置:
    1. Project Settings -> Link -> Debug (Category) , 啟用“Debug Info” 并選中“Microsoft Format”。
    2.相同的地方,選中“Separate Types”。
    3. 在相同頁的“Project Options”編輯框中,添加“/OPT:REF”,這樣可以保證從最終的二進(jìn)制中排除掉未引用的函數(shù)。

    4. Project Settings -> C++ -> General (Category) Debug Info 組合框 -> 選擇“Program Database”
    5. 假如要對無意義的堆棧進(jìn)行調(diào)用,那么需將“Optimizations”設(shè)置為“Disable (Debug)”。
  • 還要記住與代碼一起分發(fā)最終生成的pdb文件(或用其它方法使之可以得到)。以便CExceptionLogger能在最終的日志中給出源和行信息。
  • 請注重由于所有的符號,即便是很小的應(yīng)用的符號,各自的異常日志可能超過100K。我的觀點(diǎn)是磁盤空間不值錢,而開發(fā)人員為查找BUG所花的時(shí)間則很寶貴。
  • 參考資料: Bugslayer, MSJ, August 1998 by John Robbins, http://www.microsoft.com/msj/defaultframe.asp?page=/msj/0898/bugslayer0898.htm Under the Hood, MSDN, March 2002 by Matt Pietrek, http://msdn.microsoft.com/msdnmag/issues/02/03/Hood/Hood0203.asp

改進(jìn)計(jì)劃:
  • 可配置日志文件名。
  • 提供對Win64平臺的支持。
  • 提供對非x86 調(diào)用堆棧的支持。
  • 假如有任何改進(jìn)建議,不妨來信告知,以便我將它們加到下下一個(gè)版本中。
作者的聯(lián)系方式:
PJ Naughter
個(gè)人網(wǎng)站:http://www.naughter.com

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新干县| 宁津县| 浦东新区| 保山市| 北宁市| 张北县| 文安县| 汉源县| 辽中县| 汕尾市| 金堂县| 阿克苏市| 宁明县| 吴桥县| 巴中市| 醴陵市| 南城县| 邹城市| 云阳县| 资中县| 合阳县| 湟中县| 申扎县| 永寿县| 宝山区| 鸡东县| 眉山市| 秦皇岛市| 绥宁县| 特克斯县| 东辽县| 六安市| 枞阳县| 全椒县| 黄骅市| 郓城县| 和田县| 呼玛县| 宜良县| 家居| 含山县|