Windows上调试C/C++程序时自动产生coredump的设置方法

1. 安装Windows debug tool,全部使用默认安装选项即可
搜索Windbgx86_v6.12.2.633.1395371577.msi并下载
或者也可到微软官网上下载windows调试工具,windbg也在其中:https://developer.microsoft.com/zh-cn/windows/hardware/download-windbg
注:此版本为32位版,但在32位和64位操作系统上均能使用

2. 将windbg.exe设置为默认debugger工具:
起一个cmd,进入windbg的安装目录,默认是C:\Program Files (x86)\Debugging Tools for Windows (x86)\
然后执行C:> windbg.exe -I
注意-I必须大写
然后windbg的程序主窗口会自动打开,并且弹出一条信息windbg已经被成功设置为默认的debugger云云...
点确定后窗口会自动关闭,至此设置成功

3. 创建一个存放coredump文件的目录 D:\Dump

4. 修改系统注册表,捕获异常崩溃时自动产生Coredump文件:
  1) regedit打开注册表,找到注册表项,先备份:
     64位系统:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug
     32位系统:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
  2) 修改Auto的值,原来的默认值为0不启动debugger,修改为1默认启动debugger
  3) 修改Debugger的值,如果上述第2步执行成功,那么此处的值应该已经被改为了"C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe" -p %ld -e %ld -g
     现在需要将其修改为导出并保存coredump文件:
     "C:\Program Files (x86)\Debugging Tools for Windows (x86)\windbg.exe" -p %ld -c ".dump /ma /u D:\Dump\dump.dmp; .logopen /t D:\Dump\dump.txt; .time; .echo Process Status:; !dml_proc; .echo Thread Status:; ~; .echo Stack Status:; kpn; .logclose; q" -e %ld -g
     建议使用copy & paste,不要keyin以免敲错

5. 在VS里修改编译选项,输出debug信息。下述以VS2008为例:
   1) 打开项目的属性页,确认当前的配置管理器是活动(Debug)
   2) 在项目属性页中修改如下编译选项:
      配置属性->链接器->调试:
      生成调试信息:是(/DEBUG)
      生成程序数据库文件:$(TargetDir)$(TargetName).pdb
      生成映射文件:是(/MAP)
      映射导出:是(/MAPINFO:EXPORTS)
   然后按F7编译,到项目编译的debug目录下,确认除了.exe外,同时还生成了.map和.pdb文件,以方便之后的分析调试

6. 设置windbg选项:
   1) 打开windbg主窗口:开始->程序->Debugging Tools for Windows(x86)->WinDbg
   2) File->Symbol File Path:在窗口中输入:
   D:\user\Documents\Visual Studio 2008\Projects\myproject\Debug; srv*D:\Dump*https://msdl.microsoft.com/download/symbols
   其中,分号前面的D:\user\Documents\Visual Studio 2008\Projects\myproject\Debug是项目编译的debug目录
   分号后面的srv*D:\Dump*https://msdl.microsoft.com/download/symbols中,D:\Dump是上述第3步创建的目录
   3) File->Source File Path: 在窗口中输入:
   D:\user\Documents\Visual Studio 2008\Projects\myproject\myproject
   这是源码.cpp所在的目录
   至此设置成功可以退出windbg

7. 试验一下以上配置是否成功:
用VS2008创建一个新项目,输入以下代码
#include <stdio.h>

void test1()
{
    int a = 1;
int b = 0;
a /= b;
}

int main(int argc, char** argv)
{
    test1();

    return 0;
}
可以看到test1()中a/=b应该会出错,按F7编译,到debug目录下,再次确认除了.exe外,同时还生成了.map和.pdb文件
双击执行.exe,如果机器够慢的话,可以看到windbg的窗口一闪而过
到第三步创建的D:\Dump目录下,检查是否有coredump文件.dmp生成,以及简单的日志.txt,其中记录了进程线程堆栈的简单信息
详细的信息,可以打开windbg,File->Open Crash Dump,到D:\Dump目录下,选择生成的.dmp文件打开
在command窗口中,以及View菜单下面的诸如内存、汇编、寄存器等分栏中可以查看
也可在debug菜单下调试

如果源码、符号链接等都设置了,那么输入以下命令可以直接查看出错的代码位置及信息:
cmd> ! analyze -v


   
 

评论

此博客中的热门博文

利用Gitlab的Jira issue tracker实现Jira issue自动根据Gitlab commit/merge更新状态

go用xorm去update数据库的一个坑