1. 程序运行时缺陷跟踪.1.1. 内存泄漏跟踪 windows下的内存泄漏排查 >1.2. 最好还是避免手动分配内存的方式.1.2.1. 使用智能指针(shared_ptr和unique_ptr已经是C++11的一部分)std::auto_ptr && boost::share_ptr && boost::weak_ptr && boost::unique_ptr && boost::intrusive_ptr1.2.2. 使用内存池 boost::pool && boost:object_pool && boost::signgleton_pool1.2.3. 将C++11的Lambda Function和tr1::function结合起      2. 利用结构异常还原现场2.1. 没有性能损失的简单方案   2.1.1. 运行时异常.MiniDumpWriteDump && GetExceptionInformation2.1.2. 未捕获异常. SetUnhandledException() 3. 调试3.1. WINDUB基本调试命令 kb 显示call stack 内容  :kb 50, k, kb, kc, kd, kp, kP, kv(Display Stack Backtrace) !analyze -v 显示分析的详细信息。 r 可以显示系统崩溃时的寄存器,和最后的命令状态。 dd 显示当前内存地址,dd 参数:显示参数处的内存。 u 可以显示反汇编的指令 kv.bugcheck 可以显示出错的代码3.2. 调试跟踪 Windows API 第一步:设置windows符号文件第二步:symchk 获取符号文件(PDB)获得c:\windows\system32下的所有文件的符号symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols获得 c:\windows\system32\secur32.dll 的符号symchk /r c:\windows\system32\secur32.dll /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols工具 http://files.cnblogs.com/ahuo/SymRetriever.zip第三步:遇到 call、jmp指令,我们可以继续进去看看,从函数名中我们可以看到非常多的信息ScopeGuard.cppclass ScopeGuard{public:    explicit ScopeGuard(std::functionvoid()> onExitScope)        : onExitScope_(onExitScope), dismissed_(false) { }    ~ScopeGuard() {        if(!dismissed_) { onExitScope_(); }    }    void Dismiss() { dismissed_ = true; }private:    std::functionvoid()> onExitScope_;    bool dismissed_;private: // noncopyable    ScopeGuard(ScopeGuard const&);    ScopeGuard& operator=(ScopeGuard const&);};int /*__stdcall _cdecl*/ main(int arc,char ** arv){    HANDLE h1 = CreateFile(...);    ScopeGuard onExit([&] { CloseHandle(h1); });       return 0;}dumpminidump.cpp#include "dbghelp.h"#pragma comment(lib,"Dbghelp.lib")void _DumpMiniDump(LPTSTR fileName,PEXCEPTION_POINTERS excpInfo){    wstring dumpFileName = fileName;    dumpFileName += L".dmp";    HANDLE hFile = CreateFile( dumpFileName.c_str(), GENERIC_READ | GENERIC_WRITE,         0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );     MINIDUMP_EXCEPTION_INFORMATION eInfo;    eInfo.ThreadId = GetCurrentThreadId(); //把需要的信息添进去    eInfo.ExceptionPointers = excpInfo;    eInfo.ClientPointers = FALSE;    // Dump的类型是小型的, 节省空间. 可以参考MSDN生成更详细的Dump.    MiniDumpWriteDump(        GetCurrentProcess(),        GetCurrentProcessId(),        hFile,        MiniDumpNormal,        excpInfo ? &eInfo : NULL,        NULL,        NULL);    CloseHandle( hFile );}void DumpMiniDump(LPTSTR fileName){    __try {        OutputDebugString(L"raising exception\r\n");        RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL);        // throw L"";    } __except(        _DumpMiniDump(fileName,GetExceptionInformation()),        EXCEPTION_EXECUTE_HANDLER ) {}}void test(){    __try {        DumpMiniDump(L"MiniDump");    }    __except(EXCEPTION_CONTINUE_EXECUTION)    {    }}
11-08 06:24
查看更多