桌面应用程序如何检测程序崩溃?

2023-07-14 17:07:12 +08:00
 vfs

看到当前很多 Windows 上的大公司产品,都能在上次应用程序不正常退出之后,下次启动的时候弹出对话框,说是检测到程序不正常退出了。

有没有大神知道这个功能是怎么实现的?或者可能的实现思路

2017 次点击
所在节点    程序员
25 条回复
tsanie
2023-07-14 17:09:01 +08:00
application event log?
horizon
2023-07-14 17:09:23 +08:00
正常退出就写入一个 xxx
下次打开检测是否存在 xxx ,否则提示?
DTCPSS
2023-07-14 17:13:28 +08:00
启动时:
如果没有发现 "正常退出" 标记,那么上一次退出不是正常退出
清除所有标记
往存储里写个 “启动” 标记

正常退出时:
往存储里写个 "正常退出" 标记
flyqie
2023-07-14 18:17:21 +08:00
还是在什么地方写个 flag 靠谱点。。
cnbatch
2023-07-14 18:43:41 +08:00
那就用 MS Office 的套路,启动后创建个临时文件,正常退出时删掉。
下次启动时检测下临时文件是否存在,若存在就表明该程序上次崩溃了。

不建议正常退出写入文件,因为程序启动时还得判断是否为安装后初次启动,只会增加代码量。
mmdsun
2023-07-14 18:56:57 +08:00
看你用啥语言框架开发的,一般都会有个全局的异常处理器,在哪里处理异常然后或者写文件,下次启动判断弹窗就可以了
vfs
2023-07-14 19:10:14 +08:00
@tsanie 能稍微详细的描述一下不? 不太明白:(
vfs
2023-07-14 19:13:44 +08:00
@mmdsun 用的是 c++,UI 框架用 wxWidgets 。 但是截至目前,项目中并没有真正的使用 c++ 的异常机制。
ysc3839
2023-07-14 19:20:50 +08:00
可以看看 Chrome 是怎么实现的,印象中就是写到一个配置文件里
cnbatch
2023-07-14 19:22:47 +08:00
wxWidgets 就简单了,构造时判断/写文件,析构退出时删文件。
iOCZ
2023-07-14 19:57:34 +08:00
崩溃没有信号量之类的东西?
mmdsun
2023-07-14 22:41:01 +08:00
@vfs 搜索下这个框架有全局的异常处理机制,wxApp::OnUnhandledException()之类的 https://docs.wxwidgets.org/trunk/classwx_app_console.html#aca806b41cf74fd6166e4fb2e2708e9bf

——比较专业的方案,应该是集成专门的崩溃收集的 SDK ,比如 Google Breakpad 、AppCenter 这类的,崩溃日志收集比较重要。
uvwlab
2023-07-14 23:39:00 +08:00
SetUnhandledExceptionFilter
iminto
2023-07-14 23:47:35 +08:00
不需要检测。

任何编程语言都有 shutdown Hook ,在这个钩子里写方法就行
cnbatch
2023-07-15 00:04:33 +08:00
忘了一个,前面我说错了……
析构时删文件不是好主意,崩溃时 RAII 也会起作用,删掉文件

应该是关闭窗口/退出程序时删文件才对
ysc3839
2023-07-15 03:50:21 +08:00
@mmdsun 崩溃日志收集和异常退出检测机制不冲突,比如如果是外部直接结束进程,此时是收集不到崩溃信息的,但是下次启动时仍然应该要能检测出是异常退出。

另外 Google Breakpad 已停止开发,现在应该使用 Crashpad
https://chromium.googlesource.com/crashpad/crashpad/+/refs/heads/main/README.md
vfs
2023-07-15 13:11:38 +08:00
@cnbatch 明白了,感谢!
vfs
2023-07-15 13:13:44 +08:00
@mmdsun 关于这几个 SDK ,建议非常棒。 自己做 UI 时间不长,还不知道有这么好的框架,完了试用一下
vfs
2023-07-15 13:14:08 +08:00
@iOCZ Windows 上不知道有没有?
macha
2023-07-15 15:00:00 +08:00
可以试试 SetUnhandledExceptionFilter API 。具体可以查阅 MSDN 。
https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-setunhandledexceptionfilter

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

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

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

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

© 2021 V2EX