看到当前很多 Windows 上的大公司产品,都能在上次应用程序不正常退出之后,下次启动的时候弹出对话框,说是检测到程序不正常退出了。
有没有大神知道这个功能是怎么实现的?或者可能的实现思路
1
tsanie 2023-07-14 17:09:01 +08:00
application event log?
|
2
horizon 2023-07-14 17:09:23 +08:00
正常退出就写入一个 xxx
下次打开检测是否存在 xxx ,否则提示? |
3
DTCPSS 2023-07-14 17:13:28 +08:00
启动时:
如果没有发现 "正常退出" 标记,那么上一次退出不是正常退出 清除所有标记 往存储里写个 “启动” 标记 正常退出时: 往存储里写个 "正常退出" 标记 |
4
flyqie 2023-07-14 18:17:21 +08:00
还是在什么地方写个 flag 靠谱点。。
|
5
cnbatch 2023-07-14 18:43:41 +08:00
那就用 MS Office 的套路,启动后创建个临时文件,正常退出时删掉。
下次启动时检测下临时文件是否存在,若存在就表明该程序上次崩溃了。 不建议正常退出写入文件,因为程序启动时还得判断是否为安装后初次启动,只会增加代码量。 |
6
mmdsun 2023-07-14 18:56:57 +08:00 via iPhone
看你用啥语言框架开发的,一般都会有个全局的异常处理器,在哪里处理异常然后或者写文件,下次启动判断弹窗就可以了
|
8
vfs OP @mmdsun 用的是 c++,UI 框架用 wxWidgets 。 但是截至目前,项目中并没有真正的使用 c++ 的异常机制。
|
9
ysc3839 2023-07-14 19:20:50 +08:00 via Android
可以看看 Chrome 是怎么实现的,印象中就是写到一个配置文件里
|
10
cnbatch 2023-07-14 19:22:47 +08:00 via Android
wxWidgets 就简单了,构造时判断/写文件,析构退出时删文件。
|
11
iOCZ 2023-07-14 19:57:34 +08:00
崩溃没有信号量之类的东西?
|
12
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 这类的,崩溃日志收集比较重要。 |
13
uvwlab 2023-07-14 23:39:00 +08:00
SetUnhandledExceptionFilter
|
14
iminto 2023-07-14 23:47:35 +08:00 via Android
不需要检测。
任何编程语言都有 shutdown Hook ,在这个钩子里写方法就行 |
15
cnbatch 2023-07-15 00:04:33 +08:00
忘了一个,前面我说错了……
析构时删文件不是好主意,崩溃时 RAII 也会起作用,删掉文件 应该是关闭窗口/退出程序时删文件才对 |
16
ysc3839 2023-07-15 03:50:21 +08:00
@mmdsun 崩溃日志收集和异常退出检测机制不冲突,比如如果是外部直接结束进程,此时是收集不到崩溃信息的,但是下次启动时仍然应该要能检测出是异常退出。
另外 Google Breakpad 已停止开发,现在应该使用 Crashpad https://chromium.googlesource.com/crashpad/crashpad/+/refs/heads/main/README.md |
20
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 |
21
cwaken 2023-07-16 11:08:24 +08:00 via iPhone
sentry ,里面包装了 Crashpad ,好编译好引用
|
22
vfs OP @cwaken 抱歉,没用过这个框架。 请问这个是开源的项目还是需要付费的? 搜到这个网站: https://sentry.io/welcome/, 不知道对不对? 看它的描述,是需要付费的
|
24
vfs OP @macha 更新一下,SetUnhandledExceptionFilter 在发生野指针,空指针之类的错误的时候,不工作。 找到一个相关链接: https://www.codeproject.com/Articles/154686/SetUnhandledExceptionFilter-and-the-C-C-Runtime-Li
|