V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
vfs
V2EX  ›  程序员

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

  •  
  •   vfs · 2023-07-14 17:07:12 +08:00 · 2041 次点击
    这是一个创建于 500 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2023-07-14 19:12:49 +08:00
    感谢大家的建议,就不一一回复了。

    截至目前,最多的建议就是就是标记一个 flag ,然后正常退出的时候清除掉这个标记,如果程序异常退出,这个标记就会一直在,下次启动的时候,检查这个标记就能知道程序是否正常退出。 感觉很靠谱。谢啦。

    其实自己也想过类似的方案,提这个问题的最朴素的想法是: 看看有没有业内比较常用,比较专业的方案。
    25 条回复    2023-07-17 07:32:53 +08:00
    tsanie
        1
    tsanie  
       2023-07-14 17:09:01 +08:00
    application event log?
    horizon
        2
    horizon  
       2023-07-14 17:09:23 +08:00
    正常退出就写入一个 xxx
    下次打开检测是否存在 xxx ,否则提示?
    DTCPSS
        3
    DTCPSS  
       2023-07-14 17:13:28 +08:00
    启动时:
    如果没有发现 "正常退出" 标记,那么上一次退出不是正常退出
    清除所有标记
    往存储里写个 “启动” 标记

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

    不建议正常退出写入文件,因为程序启动时还得判断是否为安装后初次启动,只会增加代码量。
    mmdsun
        6
    mmdsun  
       2023-07-14 18:56:57 +08:00 via iPhone
    看你用啥语言框架开发的,一般都会有个全局的异常处理器,在哪里处理异常然后或者写文件,下次启动判断弹窗就可以了
    vfs
        7
    vfs  
    OP
       2023-07-14 19:10:14 +08:00
    @tsanie 能稍微详细的描述一下不? 不太明白:(
    vfs
        8
    vfs  
    OP
       2023-07-14 19:13:44 +08:00
    @mmdsun 用的是 c++,UI 框架用 wxWidgets 。 但是截至目前,项目中并没有真正的使用 c++ 的异常机制。
    ysc3839
        9
    ysc3839  
       2023-07-14 19:20:50 +08:00 via Android
    可以看看 Chrome 是怎么实现的,印象中就是写到一个配置文件里
    cnbatch
        10
    cnbatch  
       2023-07-14 19:22:47 +08:00 via Android
    wxWidgets 就简单了,构造时判断/写文件,析构退出时删文件。
    iOCZ
        11
    iOCZ  
       2023-07-14 19:57:34 +08:00
    崩溃没有信号量之类的东西?
    mmdsun
        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 这类的,崩溃日志收集比较重要。
    uvwlab
        13
    uvwlab  
       2023-07-14 23:39:00 +08:00
    SetUnhandledExceptionFilter
    iminto
        14
    iminto  
       2023-07-14 23:47:35 +08:00 via Android
    不需要检测。

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

    应该是关闭窗口/退出程序时删文件才对
    ysc3839
        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
    vfs
        17
    vfs  
    OP
       2023-07-15 13:11:38 +08:00
    @cnbatch 明白了,感谢!
    vfs
        18
    vfs  
    OP
       2023-07-15 13:13:44 +08:00
    @mmdsun 关于这几个 SDK ,建议非常棒。 自己做 UI 时间不长,还不知道有这么好的框架,完了试用一下
    vfs
        19
    vfs  
    OP
       2023-07-15 13:14:08 +08:00
    @iOCZ Windows 上不知道有没有?
    macha
        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
    cwaken
        21
    cwaken  
       2023-07-16 11:08:24 +08:00 via iPhone
    sentry ,里面包装了 Crashpad ,好编译好引用
    vfs
        22
    vfs  
    OP
       2023-07-16 14:51:40 +08:00
    @cwaken 抱歉,没用过这个框架。 请问这个是开源的项目还是需要付费的? 搜到这个网站: https://sentry.io/welcome/, 不知道对不对? 看它的描述,是需要付费的
    vfs
        23
    vfs  
    OP
       2023-07-16 21:04:14 +08:00
    @mmdsun 更新一下,OnUnhandledException 在发生野指针,空指针之类的错误的时候,不工作。
    vfs
        24
    vfs  
    OP
       2023-07-16 21:11:32 +08:00
    @macha 更新一下,SetUnhandledExceptionFilter 在发生野指针,空指针之类的错误的时候,不工作。 找到一个相关链接: https://www.codeproject.com/Articles/154686/SetUnhandledExceptionFilter-and-the-C-C-Runtime-Li
    cwaken
        25
    cwaken  
       2023-07-17 07:32:53 +08:00 via iPhone
    @vfs 当然是免费的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5965 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:50 · PVG 09:50 · LAX 17:50 · JFK 20:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.