请教各位老哥, Windows 下 Release 程序崩溃,应该如何定位问题?

332 天前
 liuguangxuan

背景

在有开发环境的机器上,可以调试启动代码,复现问题后,很容易就能定位到问题代码。

但是往往给用户的程序是 Release 版本的 exe ,崩溃后,可能会产生一个 dmp 文件。

问题

  1. 这个 dmp 文件是 Release 版本 exe 产生的,如何根据这个 dmp 定位到问题代码?
  2. 如果不能根据这个 dmp 文件定位到问题代码,那么是否有其他方式,定位问题代码?
  3. 是否有定位问题,调试 bug 的其他技巧?
  4. 关于调试符号( pdb 文件),了解到有符号服务器,可以专门存储符号文件,是否有相关的最佳实践?如何编译,打包,发布,存储符号,调试定位问题?
3358 次点击
所在节点    Windows
55 条回复
snailya
332 天前
我不会,我就知道打印日志。
ysc3839
332 天前
用 Visual Studio 打开 dmp 文件
liuguangxuan
332 天前
@ysc3839 #2 这个 dmp 文件是 Release 版本产生的,能看到堆栈信息吗?
corcre
332 天前
打印日志+1
实在不行让客户给个权限, 你丢个 debug 版本的过去远程调试一下
StubbornHuang
331 天前
日志大法 解决问题
ysc3839
331 天前
liaixiao
331 天前
打印日志 or ,查看 windows 的日志,windows 管理有一个日志功能,会记录程序异常退出的日志。最保险的办法还是自己打印日志
DTCPSS
331 天前
Windbg
nevermoreluo
331 天前
排除 release 编译环境问题,dmp 没法定位到问题代码,就开对应的参数 例如 zi ,降低优化之类的,注意自己到底是 mingw 还是 msvc ,两者不一样,去找下对应的编译器怎么让 dmp 文件有符号链接。
感觉大概率是什么两边配置对不上。
vs 的话就仔细对比 vcproject 文件,两个环境有啥区别,cmake 注意不要关掉 return 空的警告(曾经在某个 gcc 版本上遇到没写 return debug 好的,release 崩了的情况)

最后实在不行,你永远可以相信打印日志。。。先把作业做了,后面有空再折腾 release 的 dump 文件如何获取堆栈问题
gbw1992
331 天前
gleArk
331 天前
会汇编语言吗,x32dbg/x64dbg 反编译,跟踪到崩溃前最后一行汇编码,然后分析这一行代码具体执行了什么
不需要源代码
GreyWang
331 天前
dmp 文件已经包含了出问题时的堆栈信息,你可以用 Windows 自己生成的 dmp 文件,也可以利用 crash_handler 自己生成 dmp 文件。

如果 release 程序是用 Visual Studio 编译的:
1 、打开这个程序的解决方案文件
2 、直接把 dmp 文件拖进去 VS 打开
3 、设置符号目录、包含编译 release 程序时的 pdb 文件,或者动态库文件(如果有自己生成库的话)
4 、点击本地调试、直接跳转到崩溃时的堆栈代码帧
capella
331 天前
系统里的应用日志
sinx003
331 天前
你是用的 vs studio 开发吧,如果你能复现,可以在 release 模式下,实现 debug 下的打断点。
参考: https://blog.csdn.net/qq_36333986/article/details/103897038
sloknyyz
331 天前
用 visual studio 打开 dump ,加载 pdb ,会自动分析并显示崩溃堆栈,这是最简单方便的。
tool2d
331 天前
@nevermoreluo mingw 现在和以前不一样,只要配置一下,就可以生成 vc 能识别 codeview 调试信息。

也就是说,vc 能直接调试任何 exe 代码了。
zoe0316
331 天前
也可以试试集成 Breakpad 到项目里,根据 pdb 生成符号表,crash 的时候再解析 dmp 。

https://github.com/google/breakpad
proxytoworld
331 天前
release 的 dmp 你载入生成的 pdb 不就行了、
z4none
331 天前
使用 dmp 定位问题应该是最方便的,
pdb 文件可以用 symstore 工具管理,
保存了 pdb 文件后,通过配置环境变量 _NT_SYMBOL_PATH 就能让 vs 找到 dmp 相应版本的 pdb 文件
695975931
331 天前
给你推荐一个大佬公众号:一线码农聊技术,底下有他的联系方式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1003397

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX