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