目录

  • 如何生成 dump 文件
  • 如何生成 map 文件
    • VS生成
    • cmake 命令
  • 如何生成 cod 文件
    • VS 生成
    • cmake 命令
  • 找 crash 地址
    • step 1
    • step2
    • step3

写代码路上踩过的坑,特此记录,以免忘记
网上全部都是有 pdb 文件。Release 没有 pdb 文件。本文适用于没有 pdb 文件,如何定位

如何生成 dump 文件

作为一个程序员,必现的 bug 容易排查,最怕遇见非必现 bug,尤其是那种在自己环境上测多少次都没问题,到用户环境偶尔会 crash,无从下手,让人瞬间抓狂。并且像这种非必现 bug 一般很难采用日志的方式来定位。

这个时候就需要保留程序 crash 的环境,最好的方式就是生成 Dump 文件。如果要利用 C++ 代码生成,可以直接采用库函数
MiniDumpWriteDump

头文件

  • #include <dbghelp.h>
  • #pragma comment(lib, “dbghelp.lib”)      一定要连接这个库,否则无法使用
#include <windows.h>
#include <dbghelp.h>#pragma comment(lib, "dbghelp.lib")void exceptionHandler(PEXCEPTION_POINTERS excpInfo) {std::mutex g_handlerLock;std::unique_lock<std::mutex> lk(g_handlerLock);std::string dump_dir = "D:\\code\\crash.dmp";LONG ret = EXCEPTION_CONTINUE_SEARCH;HANDLE hFile =::CreateFile(dump_dir.c_str(), GENERIC_WRITE, FILE_ATTRIBUTE_READONLY,NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE) {MINIDUMP_EXCEPTION_INFORMATION exptInfo;exptInfo.ThreadId = ::GetCurrentThreadId();exptInfo.ExceptionPointers = excpInfo;BOOL bOK =::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(),hFile, MiniDumpNormal, &exptInfo, NULL, NULL);if (bOK) {ret = EXCEPTION_EXECUTE_HANDLER;}}
}LONG WINAPI unhandledException(PEXCEPTION_POINTERS excpInfo = nullptr) {if (excpInfo == nullptr) {__try {RaiseException(EXCEPTION_BREAKPOINT, 0, 0, nullptr);} __except(exceptionHandler(GetExceptionInformation()),EXCEPTION_EXECUTE_HANDLER) {}} else {exceptionHandler(excpInfo);}return 0;
}int main(int argc, char** argv) {SetUnhandledExceptionFilter(unhandledException);
}

通过上面的方法,就会生成 dump 文件,如果要生成指定信息的 dump 文件,只需修改 MiniDumpWriteDump() 对应的参数即可

如何生成 map 文件

map 文件中记录是程序的各种地址信息

VS生成

  1. 打开项目的“属性页”对话框。
  2. 链接器 —> 所有选项—>生成映射文件—>是
  3. 就会在程序目录下生成 .map 文件。。如果找不到,直接搜索

cmake 命令

target_link_options(${EXE_NAME_UI} PRIVATE “/MAP:${CMAKE_CURRENT_BINARY_DIR}/test.map”)

其中,EXE_NAME_UI 是自己设置的 exe 的name ,后面可指定生成的文件夹

如果只有这两个文件的话,只能定位到 crash 的函数,而不能精确定位到 行数

如何生成 cod 文件

.cod 文件里面记录了源码已经对应的汇编代码,已经行号

VS 生成

  1. 打开项目的“属性页”对话框。
  2. 属性页 —> C/C++ —> 输出文件 —> 汇编程序输出 —> 选择 程序集、机器码和源代码
  3. 就可以在默认路径下生成 .cod 文件

cmake 命令

set(MSVC_COVERAGE_COMPILE_FLAGS “/FAcs”)
set(CMAKE_CXX_FLAGS “${MSVC_COVERAGE_COMPILE_FLAGS} ${CMAKE_CXX_FLAGS}”)

这个目前没有找到可以指定输出路径的方法,知道的大佬可以告知一下

找 crash 地址

有了这三个文件,就可以定位到 crash 的地方了

写了一个很简单的例子。。空指针赋值问题,肯定会 crash

#include <iostream>
#include <windows.h>
#include <dbghelp.h>
#include <string>#pragma comment(lib, "dbghelp.lib")void exceptionHandler(PEXCEPTION_POINTERS excpInfo) {std::string dump_dir = "F:\\code\\crash.dmp";LONG ret = EXCEPTION_CONTINUE_SEARCH;HANDLE hFile = CreateFileA(dump_dir.c_str(), GENERIC_WRITE, FILE_ATTRIBUTE_READONLY,NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);if (hFile != INVALID_HANDLE_VALUE) {MINIDUMP_EXCEPTION_INFORMATION exptInfo;exptInfo.ThreadId = ::GetCurrentThreadId();exptInfo.ExceptionPointers = excpInfo;BOOL bOK =::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(),hFile, MiniDumpNormal, &exptInfo, NULL, NULL);}
}LONG WINAPI unhandledException(PEXCEPTION_POINTERS excpInfo = nullptr) {if (excpInfo == nullptr) {__try{RaiseException(EXCEPTION_BREAKPOINT, 0, 0, nullptr);}__except (exceptionHandler(GetExceptionInformation()),EXCEPTION_EXECUTE_HANDLER) {}}else {exceptionHandler(excpInfo);}return 0;
}void errorFun()
{int* p = nullptr;*p = 1;
}void testfun1()
{}void testfun2()
{}
void testfun3()
{}int main()
{SetUnhandledExceptionFilter(unhandledException);testfun1();testfun2();testfun3();errorFun();return 0;
}

编译运行。。dump 文件的生成一定要在外面独立运行 exe,不要在 VS 里面执行,因为 VS 会在 crash 的地方中断

step 1

用 windbg 工具打开 dump 文件。。我用的是 windbg preview


点击红框即可,windbg 会自动帮你输入命令进行分析

crash 的地址以及出现了。就会得到 0x000012ed。。记住这个值

step2

打开 .map 文件
会是一堆这样的信息。。具体含义我就不介绍了,可以玩网上搜,有介绍。。往下拉

这四个东西是我们需要相关注的。。

Address 基地址
publics by value 就是函数名
Rva+Base 经过计算后的地址
Lib:Object 文件名

这时候就需要拿第一步得到的地址 0x000012ed 和 Rva+Base 进行比较。。判断位于哪两个地址之间

就会发现 crash 的地方是在 main 函数。。
这时候你肯定会疑惑,明明 crash 的地方是在 errorfun 函数里面。但是不是在 main 里面调用的 errorfun()

说实话。。这块按理来说 map 文件中会存储调用函数的地址的,就可以很准确的找到是 errorfun 函数的问题。我做的项目就有,不知道这个测试例子为啥没有。。

但这并不影响,接着往下看

我们第二步已经精确定位到函数了。接下来就是行数了

step3

再回到 windbg 工具中

拿到这个地址,然后去反汇编里面搜索

复制后面的汇编语句。打开 cod 文件,进行搜索


阿西吧!!!!!
大功告成。。找到了具体的位置。。

有人说,,为什么不直接在 cod 中搜索,要第二步干什么。。。
如果你是在做一个大项目的话,汇编语句肯定会有重复的,所以说一定要先定位到具体的函数,再去找具体的行数

如果你有 pdb 文件的话,就会轻松很多很多

C++ 利用 windbg + dump + map + cod 文件分析 crash 原因相关推荐

  1. vs2012 map cod文件崩溃信息

    最近在做服务器,很是纠结崩溃信息获取,网上查了些资料,直指map文件信息分析 1.首先生成map cod 文件 直接上图 然后直接编译生成PokerPDKServer.map  和每一个cpp对已的T ...

  2. iOS通过dSYM文件分析crash

    http://blog.csdn.net/hjy_x/article/details/20929095 重点是dwarfdump --uuid命令 我们在ios开发中会碰到的很多crash问题,如果D ...

  3. windbg蓝屏dmp文件分析

    MSDN蓝屏代码查看:Bug Check Code Reference WinDbg官方下载: https://developer.microsoft.com/en-us/windows/hardwa ...

  4. Windbg dump分析 学习总结

    Windbg核心调试之dump分析 http://www.pediy.com/kssd/pediy08/pediy8-428.htm 标 题: Windbg核心调试之dump分析 作 者:Lvg 时 ...

  5. Windbg内核调试之四: Dump文件分析

    Dump 文件分析很大程度上就是分析蓝屏产生的原因.这种系统级的错误算是Windows提示错误中比较严重的一种(更严重的还有启动黑屏等硬件或软件兼容性错误等等).说它是比较严重,是因为毕竟Window ...

  6. vs2010利用map,cod文件定位崩溃代码行

     利用map,cod文件定位崩溃代码行 利用vs2010 新建一个空的控制台项目,添加文件gtg.cpp,内容如下 void crash() { inti=1; intj=0; i/=j; } i ...

  7. 利用Windbg分析高内存占用问题

    大家好,我是本期的微软 MVP 实验室研究员--冯辉.本篇文章主要介绍如何利用Windbg分析应用进程中的内存问题,从托管堆到非托管堆的探索以及到内存的分配,接下来我们一起来探索吧. 近期有几位朋友使 ...

  8. 利用WinDbg和wscript.exe分析JavaScript脚本

    本文讲的是利用WinDbg和wscript.exe分析JavaScript脚本 介绍 攻击者经常使用JavaScript来编写恶意软件因为它系统默认解析很少被禁用.我们之前关于.NET分析的文章引起了 ...

  9. Dump文件分析整理

    1. dump介绍 Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.Dump文件是用来给驱动程序编写人员调试驱动程序用的,这种文件必须用专用工具软件打开,比如使用Wi ...

最新文章

  1. 更新linux内核版本,求问Linux最新内核版本以及发布日期。
  2. .Net Crank性能测试入门
  3. [Python]网络爬虫(七):Python中的正则表达式教程(转)
  4. 编程之美2014 资格赛题目3 : 格格取数
  5. 程序员群名称大全_微信群群名技巧和群名称大全(上)
  6. python入门爬虫案例_[Python入门学习]-爬虫项目案例讲解
  7. Attention Please
  8. PLSql不用安装Oracle客户端,实现远程连接
  9. 网上订餐php论文,php032网上订餐系统
  10. matlab 平滑曲线连接_Matlab的5个控制类工具箱介绍
  11. 2022-2028年中国光电广告产业竞争现状及发展趋势分析报告
  12. 算法题_寻找最大连通区域
  13. 原来《羊了个羊》也求助了云,拦截bot自动化攻击达5000万次 | CCF C³
  14. Java 设计模式 本文代码拉取链接 https://gitlab.com/zhangpengweiLJ/designpettern.git
  15. Linux环境下运行matlab以及执行m文件
  16. 添加tomcat服务
  17. 常用政务网络查询单打印地址
  18. 简简单单玩转CSS3(1)
  19. YOLOv7 | 模型结构与正负样本分配解析
  20. 陆奇:一个完美主义者的退出

热门文章

  1. 摩根大通区块链支付网络计划于1月日本启动
  2. 手机显示主宰进攻服务器,xy盛世遮天真龙主宰
  3. 2020年下半年教育热点事件舆情分析研判报告整合
  4. 牛人的笔记本拆装-来自百度贴吧
  5. 计算机房验收标准,机房标准工程验收标准和方法.doc
  6. 黑苹果系统安装常见问题汇集
  7. python中的set是什么意思_python中的set是什么
  8. WIN10 共享 访问WIN7提示 出现“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问
  9. layer弹出iframe的高度不自适应。一直是150px
  10. 利用 SGA 共享池,避开 parse 阶段