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

2023-12-26 08:12:38 +08:00
 liuguangxuan

背景

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

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

问题

  1. 这个 dmp 文件是 Release 版本 exe 产生的,如何根据这个 dmp 定位到问题代码?
  2. 如果不能根据这个 dmp 文件定位到问题代码,那么是否有其他方式,定位问题代码?
  3. 是否有定位问题,调试 bug 的其他技巧?
  4. 关于调试符号( pdb 文件),了解到有符号服务器,可以专门存储符号文件,是否有相关的最佳实践?如何编译,打包,发布,存储符号,调试定位问题?
3446 次点击
所在节点    Windows
55 条回复
apie
2023-12-26 11:04:16 +08:00
ReleaseWithDebugInfo
shuax
2023-12-26 11:12:37 +08:00
我会 x64dbg 和 ida 配合使用。
pzpr
2023-12-26 11:20:09 +08:00
我一般用 windbg 分析 dump ,通过崩溃线程和变量值定位到代码后自己复现,看到上面有老哥说 vs studio 也可以用,下次尝试下
ashong
2023-12-26 11:27:29 +08:00
@liuguangxuan 可以,如果你编译的时候生成 debug info , 记得保留好 pdb 以及源代码状态。

用 vs 或者 windbg 都可定位
402124773
2023-12-26 11:33:46 +08:00
既然有 dump ,你自己又有 pdb ,那肯定是使用 windbg 啊。可以直接看到最后出错的 stack 。
liuguangxuan
2023-12-26 13:09:36 +08:00
@snailya #1 已经很厉害了。
liuguangxuan
2023-12-26 13:12:54 +08:00
@ashong #24 老哥可否细说一下”保留好 pdb 以及源代码状态“?
pdb 我看楼下有提到了 symstore ,是这个吗?
源代码状态,git 版本回退回来是否可以?
liuguangxuan
2023-12-26 13:14:07 +08:00
@corcre #4 就算客户给了权限,debug 版本依赖 mfc100ud.dll 、msvcp100d.dll 等各种后缀带 d 的动态库,也没办法直接运行 debug 版本的 exe 。
liuguangxuan
2023-12-26 13:14:59 +08:00
@StubbornHuang #5 如果是维护一个比较大型的旧项目,根本不知道在哪里加日志。😂
liuguangxuan
2023-12-26 13:16:54 +08:00
@nevermoreluo #9 #5 如果是维护一个比较大型的旧项目,根本不知道在哪里加日志。😂
liuguangxuan
2023-12-26 13:18:47 +08:00
@gleArk #11 老哥可否细说一下?反编译 exe ,还是 dmp ?如何查到崩溃前最后一行汇编码?查到了汇编码怎么定位问题代码?
liuguangxuan
2023-12-26 13:22:29 +08:00
@GreyWang #12 老哥,假如这个程序是由自动打包工具编译生成的,不是我生成的,而且我没有编译 release 程序时的 pdb 文件,那么怎么定位问题代码呢?
liuguangxuan
2023-12-26 13:23:53 +08:00
@sloknyyz #15 老哥,我没有 pdb ,exe 是自动打包工具编译生成的。这种情况下如何定位问题呢?
liuguangxuan
2023-12-26 13:25:53 +08:00
@zoe0316 #17 多谢老哥,我去了解一下这个工具。
liuguangxuan
2023-12-26 13:26:32 +08:00
@proxytoworld #18 老哥,我没有 pdb ,exe 是自动打包工具编译生成的。这种情况下如何定位问题呢?
liuguangxuan
2023-12-26 13:27:18 +08:00
@z4none #19 多谢老哥,我去了解一下。
liuguangxuan
2023-12-26 13:28:11 +08:00
@shuax #22 老哥牛。
liuguangxuan
2023-12-26 13:28:53 +08:00
@402124773 #25 老哥,我没有 pdb ,exe 是自动打包工具编译生成的。这种情况下如何定位问题呢?
JerryV2
2023-12-26 14:37:09 +08:00
两个比较靠谱的方式:

1 、使用 winDbg

2 、使用远程调试
liuguangxuan
2023-12-26 15:29:01 +08:00
@JerryV2 #39 老哥,”使用远程调试“指的是在开发机器上,使用附加进程的方式,附加到客户机器上的 exe 吗?

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

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

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

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

© 2021 V2EX