Windows 闪退问题排查分析

        正常程序运行出错,会被CrashRpt抓住,但是有时候没有抓住,程序就突然退出了,于是就发生了所谓的闪退。

哪些情况会闪退

项目

方式

说明

主动退出

调用exit

退出主循环

虽然不太可能,但是难免不会出现某个三方库包含了不干净的代码,埋藏了一个定时炸弹

主线程卡死

不响应系统事件

操作系统侦测到这种情况会主动杀死进程,进程没有机会捕捉异常并上报

未捕捉到异常

可能与运行的环境有关,具体原因需要进一步排查

Windows Error Report(WER)

        注册表配置项目

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\

HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\Windows Error Reporting\ (在 64位系统中运行 32 位程序)

配置项目

解释

默认值

DebugApplications\

    [Application Name]

是否调试

0

LocalDumps\[Application Name]\

需要 LocalDumps 项目,否则不输出 dump

    DumpFolder

Dump输出路径

%LOCALAPPDATA%\CrashDumps

    DumpCount

Dump保存个数

10

    DumpType

Dump类型

0 - Custom dump
1 - Minidump (default)
2 - Full dump

    CustomDumpFlags

Dump Flags

前提:DumpType=0

{MiniDumpWithDataSegs

|MiniDumpWithUnloadedModules

|MiniDumpWithProcessThreadData}

参考:

收集User-Mode转储 - Win32 apps | Microsoft Docs

WER 设置 - Win32 apps | Microsoft Docs

闪退问题的应对措施

  • 应用日志

        查看闪退前的应用日志,日志中可能有一些蛛丝马迹,比如一些错误警告信息。通过日志也能够大概还原闪退前的使用操作,对分析与复现问题有很大帮助。

  • 性能监控

        应用闪退前的系统性能、应用性能对排查问题可能有一些帮助。建议测试前,配置Windows性能监控。参考:

Windows性能监控工具Perfmon的使用、性能指标分析

  • 事件日志

        在CrashRpt没有捕捉到异常时,Windows事件系统会记录到应用的这个错误,在一些情况下可以通过记录的信息来获取崩溃或问题位置。

使用Windows事件查看器调试崩溃

  • 闪退恢复

        通过另一个进程辅助,重新启动应用,并上报闪退信息。

闪退上报方案

  • Crashdump 收集

        首先,需要添加下面这个注册表项,这样就能生成 crash dump 了,大部分机器一开始是没有的

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\

  • 闪退监测

        需要辅助进程来监测,与主进程一起启动,通过共享内存协助,主进程在共享内存中写入进程id,如果正常退出,就清空写入的信息(写入0)。

辅助进程监测到管道断开,并且共享内存中的pid没有清空时,就判断出主进程Crash了。

        

        通过读取 Windows事件,进一步验证主进程Crash。如果 CrashRpt 抓住了应用异常,则没有相应的事件生成。这时候不需要上报闪退日志。

        系统生成 Windows事件和 dump文件需要一段时间,这时候会有等待(不超过 5秒+10秒)。

  • 日志上报

        闪退日志上报与崩溃日志上报使用统一的后台接口。区别在于:

  1. 闪退日志没有截图
  2. zip包中没有截图、crashrpt.xml
  • 应用重启

        释放共享内存,重启主进程

附:CrashRpt原理

        下面仅针对window平台的实现,说明一下异常捕捉(Catch)的原理,不包括上报方案。

CrashRpt: About Exceptions and Exception Handling

捕捉项目

系统API

原理说明

备注

全局异常

    结构化(SEH)异常

SetUnhandledExceptionFilter

    虚函数调用异常

_set_purecall_handler

_get_purecall_handler, _set_purecall_handler | Microsoft Docs

    内存分配异常

_set_new_mode

_set_new_handler

    非法参数异常

_set_invalid_parameter_handler

    非正常退出

signal:SIGABRT

    中断信号

signal:SIGINT

    终止信号

signal:SIGTERM

线程相关

    terminate调用

set_terminate

set_terminate (CRT) | Microsoft Docs

    unexpected调用

set_unexpected

set_unexpected (CRT) | Microsoft Docs

    浮点数异常

signal:SIGFPE

    非法指令

signal:SIGILL

    非法地址访问

signal:SIGSEGV

### 解决 Redis 在 Windows 上运行时出现的闪退问题 当遇到 Redis 在 Windows 平台上运行不稳定并频繁发生崩溃的情况,通常可以从以下几个方面着手解决问题: #### 1. 版本兼容性检查 确保使用的 Redis 版本与操作系统版本相匹配。官方建议尽可能使用最新稳定版的 Redis 来获得更好的性能和支持[^1]。 #### 2. 配置文件优化 调整 `redis.windows.conf` 文件中的参数设置以适应 Windows 环境下的资源分配情况。特别是对于内存限制、最大连接数等关键配置项要特别注意合理设定。 #### 3. 使用事件查看器排查错误日志 通过 Windows 的事件查看器(Event Viewer),可以找到关于应用程序和服务的日志记录,这有助于定位具体的异常原因。如果 Redis 存在未处理的异常,则会在应用和服务日志中留下痕迹。 #### 4. 启用调试模式 可以通过修改启动命令来启用更详细的日志输出,以便于后续分析。例如,在命令行中加入 `-v` 参数可以让程序打印更多的诊断信息到控制台窗口: ```bash redis-server.exe --service-start --loglevel verbose ``` #### 5. 安全性和权限管理 确认 Redis 进程拥有足够的权限访问所需的数据目录和其他依赖资源;同时也要防止因过度开放端口而导致的安全风险。 #### 6. 更新驱动和补丁 保持硬件设备驱动以及操作系统的更新状态良好,有时旧版本可能存在某些已知漏洞或不稳定性因素影响软件正常工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fighting Horse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值