看到当前很多 Windows 上的大公司产品,都能在上次应用程序不正常退出之后,下次启动的时候弹出对话框,说是检测到程序不正常退出了。
有没有大神知道这个功能是怎么实现的?或者可能的实现思路
1
tsanie 322 天前
application event log?
|
2
horizon 322 天前
正常退出就写入一个 xxx
下次打开检测是否存在 xxx ,否则提示? |
3
DTCPSS 322 天前
启动时:
如果没有发现 "正常退出" 标记,那么上一次退出不是正常退出 清除所有标记 往存储里写个 “启动” 标记 正常退出时: 往存储里写个 "正常退出" 标记 |
4
flyqie 322 天前
还是在什么地方写个 flag 靠谱点。。
|
5
cnbatch 322 天前
那就用 MS Office 的套路,启动后创建个临时文件,正常退出时删掉。
下次启动时检测下临时文件是否存在,若存在就表明该程序上次崩溃了。 不建议正常退出写入文件,因为程序启动时还得判断是否为安装后初次启动,只会增加代码量。 |
6
mmdsun 322 天前 via iPhone
看你用啥语言框架开发的,一般都会有个全局的异常处理器,在哪里处理异常然后或者写文件,下次启动判断弹窗就可以了
|
9
ysc3839 322 天前 via Android
可以看看 Chrome 是怎么实现的,印象中就是写到一个配置文件里
|
10
cnbatch 322 天前 via Android
wxWidgets 就简单了,构造时判断/写文件,析构退出时删文件。
|
11
iOCZ 322 天前
崩溃没有信号量之类的东西?
|
12
mmdsun 322 天前
@vfs 搜索下这个框架有全局的异常处理机制,wxApp::OnUnhandledException()之类的 https://docs.wxwidgets.org/trunk/classwx_app_console.html#aca806b41cf74fd6166e4fb2e2708e9bf
——比较专业的方案,应该是集成专门的崩溃收集的 SDK ,比如 Google Breakpad 、AppCenter 这类的,崩溃日志收集比较重要。 |
13
uvwlab 322 天前
SetUnhandledExceptionFilter
|
14
iminto 322 天前 via Android
不需要检测。
任何编程语言都有 shutdown Hook ,在这个钩子里写方法就行 |
15
cnbatch 322 天前
忘了一个,前面我说错了……
析构时删文件不是好主意,崩溃时 RAII 也会起作用,删掉文件 应该是关闭窗口/退出程序时删文件才对 |
16
ysc3839 322 天前
@mmdsun 崩溃日志收集和异常退出检测机制不冲突,比如如果是外部直接结束进程,此时是收集不到崩溃信息的,但是下次启动时仍然应该要能检测出是异常退出。
另外 Google Breakpad 已停止开发,现在应该使用 Crashpad https://chromium.googlesource.com/crashpad/crashpad/+/refs/heads/main/README.md |
20
macha 321 天前
可以试试 SetUnhandledExceptionFilter API 。具体可以查阅 MSDN 。
https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-setunhandledexceptionfilter |
21
cwaken 321 天前 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
|