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
搜索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
评论
发表评论