VS使用DUMP文件调试

Dump文件是进程的内存镜像,可以把程序的执行状态通过调试器保存到dump文件中。Dump 文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,如:WinDbg , VisualStudio。当我们的程序发布出去之后,在客户机上是无法跟踪自己代码的 BUG 的,我们可以通过 .dmp 文件把出现 BUG 的情况再现,然后再现客户环境 (包括堆栈调用等情况),设置源码调试路径,可以找到出现 BUG 的语句。

1、准备数据,生成dump
1)在VS中编译以下代码,生成EXE程序

#include 
#include 
#include 

#pragma comment(lib, "Dbghelp.lib")


LONG WINAPI MyUnhandledFilter(struct _EXCEPTION_POINTERS *lpExceptionInfo)
{
    LONG ret = EXCEPTION_EXECUTE_HANDLER;

    TCHAR szFileName[64];
    SYSTEMTIME st;
    ::GetLocalTime(&st);
    sprintf_s(szFileName, _T("%04d-%02d-%02d-%02d-%02d-%02d-%02d-%02d.dmp"), st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, rand() % 100);

    HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        MINIDUMP_EXCEPTION_INFORMATION ExInfo;

        ExInfo.ThreadId = ::GetCurrentThreadId();
        ExInfo.ExceptionPointers = lpExceptionInfo;
        ExInfo.ClientPointers = false;

        // write the dump
        BOOL bOK = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL);

        if (bOK)
        {
            printf("Create Dump File Success!\n");
        }
        else
        {
            printf("MiniDumpWriteDump Failed: %d\n", GetLastError());
        }

        ::CloseHandle(hFile);
    }
    else
    {
        printf("Create File %s Failed %d\n", szFileName, GetLastError());
    }
    return ret;
}

int main()
{
    ::SetUnhandledExceptionFilter(MyUnhandledFilter);

    int a = 0;
    int b = 2;
    int c = b / a;

    return 0;
}

2)执行EXE程序


image.png

3)执行完后DEBUG目录下有DMP文件(保证EXE、DMP、PDB在相同目录并使用相同版本)


VS使用DUMP文件调试_第1张图片
image.png

2、调试Dump文件
1)使用visual studio打开上图中的dump文件,选择本地调试


VS使用DUMP文件调试_第2张图片
image.png

2)可以定位到发生crash的代码位置


VS使用DUMP文件调试_第3张图片
image.png

你可能感兴趣的:(VS使用DUMP文件调试)