Release版本崩溃/闪退调试方法之一

一种Release版本崩溃/闪退调试方法

Debug模式调试断点、步进追溯源码都很方便。但是当多个模块发布Release版本,集成应用过程中偶发性闪退或者崩溃。而此时又无法用Debug相关调试信息...这就比较棘手了。

本文采用Windbg.exe来定位相关问题所在源码位置,便于更正。

1、源码中添加dmp文件输出

#include <windows.h>
#include <DbgHelp.h>
#pragma comment( lib, "Dbghelp.lib" )

//程式异常捕获
LONG WINAPI ApplicationCrashHandler(EXCEPTION_POINTERS* pException)
{
    //创建 Dump 文件  
    HANDLE hDumpFile = CreateFile(TEXT("crash.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // crash.dmp 崩溃生成文件名
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        //Dump信息  
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;

        //写入Dump文件内容  
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
    }

    //这里弹出一个错误对话框并退出程序  
    //QMessageBox::critical(NULL, "程序崩溃", "抱歉,请联系JCXY解决!");

    return EXCEPTION_EXECUTE_HANDLER;
}

# main函数或DllMain中添加如下语句
SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);//注册异常捕获函数

完整示例如下:------------示例 start-----------------

#include <iostream>
#include <windows.h>
#include <DbgHelp.h>
#pragma comment( lib, "Dbghelp.lib" )

//程式异常捕获
LONG WINAPI ApplicationCrashHandler(EXCEPTION_POINTERS* pException)
{
    //创建 Dump 文件  
    HANDLE hDumpFile = CreateFile(TEXT("crash.dmp"), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hDumpFile != INVALID_HANDLE_VALUE)
    {
        //Dump信息  
        MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
        dumpInfo.ExceptionPointers = pException;
        dumpInfo.ThreadId = GetCurrentThreadId();
        dumpInfo.ClientPointers = TRUE;

        //写入Dump文件内容  
        MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
    }

    //这里弹出一个错误对话框并退出程序  
    //QMessageBox::critical(NULL, "程序崩溃", "抱歉,请联系JCXY解决!");

    return EXCEPTION_EXECUTE_HANDLER;
}

int main()
{
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ApplicationCrashHandler);//注册异常捕获函数
    int a = 1;
    int b = 0;
    printf("%d\n", a / b);

}

------------------------------示例 end-----------------------------------------------

2、编译生成release版本。

(此处项目名为MyProject)

3、双击exe运行。

(生成crash.dmp)

4、打开Windbg

按exe是X64/X86选择是WinDbg对应应用。

5、File -> Open Crash Dump... 选取crash.dmp文件。

6、在下图命令行输入.sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols

绿色字体为symbols路径,按实际需求更改

#语法格式srv*{cache path}*{symbol server}

7、分析崩溃的位置
同样位置输入

!analyze -v

然后从相关信息中就可以找到问题所在啦!

总结:
一、生成dmp文件

二、windbg分析dmp文件

    1、打开crash dump 文件

    2、设置symbol路径:.sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols

    (C:\Symbols按实际要求更改)

    3、分析崩溃位置:!analyze -v

猜你喜欢

转载自blog.csdn.net/y474641474/article/details/108871703
今日推荐