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

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

  •  
  •   vfs · 310 天前 · 1820 次点击
    这是一个创建于 310 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  310 天前
    感谢大家的建议,就不一一回复了。

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

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

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

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

    ——比较专业的方案,应该是集成专门的崩溃收集的 SDK ,比如 Google Breakpad 、AppCenter 这类的,崩溃日志收集比较重要。
    uvwlab
        13
    uvwlab  
       310 天前
    SetUnhandledExceptionFilter
    iminto
        14
    iminto  
       310 天前 via Android
    不需要检测。

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

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

    另外 Google Breakpad 已停止开发,现在应该使用 Crashpad
    https://chromium.googlesource.com/crashpad/crashpad/+/refs/heads/main/README.md
    vfs
        17
    vfs  
    OP
       310 天前
    @cnbatch 明白了,感谢!
    vfs
        18
    vfs  
    OP
       310 天前
    @mmdsun 关于这几个 SDK ,建议非常棒。 自己做 UI 时间不长,还不知道有这么好的框架,完了试用一下
    vfs
        19
    vfs  
    OP
       310 天前
    @iOCZ Windows 上不知道有没有?
    macha
        20
    macha  
       310 天前
    可以试试 SetUnhandledExceptionFilter API 。具体可以查阅 MSDN 。
    https://learn.microsoft.com/en-us/windows/win32/api/errhandlingapi/nf-errhandlingapi-setunhandledexceptionfilter
    cwaken
        21
    cwaken  
       309 天前 via iPhone
    sentry ,里面包装了 Crashpad ,好编译好引用
    vfs
        22
    vfs  
    OP
       309 天前
    @cwaken 抱歉,没用过这个框架。 请问这个是开源的项目还是需要付费的? 搜到这个网站: https://sentry.io/welcome/, 不知道对不对? 看它的描述,是需要付费的
    vfs
        23
    vfs  
    OP
       308 天前
    @mmdsun 更新一下,OnUnhandledException 在发生野指针,空指针之类的错误的时候,不工作。
    vfs
        24
    vfs  
    OP
       308 天前
    @macha 更新一下,SetUnhandledExceptionFilter 在发生野指针,空指针之类的错误的时候,不工作。 找到一个相关链接: https://www.codeproject.com/Articles/154686/SetUnhandledExceptionFilter-and-the-C-C-Runtime-Li
    cwaken
        25
    cwaken  
       308 天前 via iPhone
    @vfs 当然是免费的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4994 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 07:04 · PVG 15:04 · LAX 00:04 · JFK 03:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.