windows下vs2015+windbg调试C++ release程序

背景

开发的一个C++项目(IDE使用vs2015)最近在release环境(安装成windows服务)下测试会偶现crash,没有任何日志产生,不知如何调试。

网上查阅相关资料,最终使用vs + windbg 成功捕获到崩溃堆栈,定位到了问题代码。那么为什么要用windbg呢,直接用vs调试不行吗?是的,有些多线程竞争引起的crash问题有时候非常难重现,我在vs上用release模式跑始终重现不了,所以要借助windbg。

工具

vs2015就不多说了,windbg自行网上下载。

windows下vs2015+windbg调试C++ release程序

调试过程

1.根据下面这篇blog设置让vs2015对于release版的程序也生成pdb文件。

https://blog.****.net/yhc166188/article/details/80695317

windows下vs2015+windbg调试C++ release程序

经过设置编译后 bin目录下会生成与exe文件同名的pdb文件。程序安装后(在我的情景下是安装成windows服务),将此pdb文件拷贝到与exe文件在同一目录下。

2.启动要调试的程序,用windows任务管理器找到对应的进程pid,启动windbg attach这个pid。

我这里对应的pid是11292,命令行启动windbg attach到这个进程进行监控,-p就是指定pid。

右侧为弹出的windbg的图形界面。

windows下vs2015+windbg调试C++ release程序

3.触发可能会导致crash的操作,然后就慢慢等待吧,一旦windbg捕获到异常,它会显示出来。

windows下vs2015+windbg调试C++ release程序

windbg捕获到异常,直接定位到了某一行代码!(前提是一定要有pdb文件并且跟exe文件在同一目录)windows下vs2015+windbg调试C++ release程序

此时点击windbg工具栏的Call stack按纽或者快捷键Alt+6就可以显示出调用堆栈。

多说几句

针对这类crash问题,网上也有很多教程是采用生成dump文件来调试的,但目前我暂时还用不上这种调试方法,上面的调试过程已经解决了我的问题。

如有其它针对此类问题的调试神器或方法,欢迎留言探讨。