ELDEN RING NIGHTREIGN

ELDEN RING NIGHTREIGN

Not enough ratings
一个可能有用的闪退问题修复思路
By Cattolina
   
Award
Favorite
Favorited
Unfavorite
症状
表现为突然毫无征兆的闪退,如同直接杀程序。第一次闪退不知道什么时候会触发,一旦只要触发第一次闪退后,那么后续如果重进游戏便很快触发连续闪退,哪怕什么都不做都会触发闪退。甚至游戏进度条刚加载完就触发闪退。只有重启电脑才能解决高频闪退问题。但是依然不知道什么时候会触发新一轮的第一次闪退

网上许多解决办法,要么是关QQ、改成utf-8、把无边框改成全屏,实际上,至少我这边都没有用,而且它们最后一步都有个重启电脑,重启后是有一段时间不会闪退,但最终还是会触发。

要么就是卖加速器的。这一眼都不是网络问题(如果是网络问题在游戏过程中就会感到丢包,而不是流畅的玩着毫无征兆的闪退,况且如果是网络问题也会正常程序退到初始页面,而不是跟alt+f4似的毫无征兆地程序暴毙,十个闪退解决方法八个卖加速器,把人当傻子么)
思路
猜想
第一,闪退是小蓝熊的问题。很容易证实,脱机游戏一点问题都没有。但是,总归还是想联机玩对吧。
第二,网上的许多无效解决方案有一个共同点就是重启电脑,重启电脑有一个共性就是释放内存。很有可能是某种错误写入内存,被小蓝熊检测到,被误认为非法操作进而中止游戏。而这个错误不太可能是出自游戏自身,因为游戏中止后会释放自身占用内存。更可能是来自后台运行的服务或者系统,游戏虽然中止了,但有问题的那块内存还在利用着,所以第二次开游戏时候小蓝熊再次检测到那块内存,很快又闪退了。
而电脑重启后全局释放内存,所以这次能玩很久。然而治标不治本,根源问题没有解决所以过段时间还会闪退。

排查
  • Win + R 输入 eventvwr.msc 回车,左侧选择 Windows 日志→ 应用程序,找到闪退时间的系统日志



    如图所示,这是一次典型的闪退日志,主要能看到异常0xc0000005,这个异常基本就明示是内存出错,可能是试图访问未分配、已释放、内存溢出或者受保护或非法的内存地址

  • 从procmon监控程序捕获程序闪退时的运行

    • EAC正常启动并加载了 kernel.appcore.dll,然后成功创建多个线程,CreateFileMapping、Load Image、RegOpenKey 等操作全部返回 SUCCESS
    • 但是突然短时间内大量Thread Exit线程退出 → CloseFile → Process Exit。
      最终EAC本体执行了 Process Exit(进程主动退出),没有异常代码或崩溃提示,说明是主动退出而非崩溃。
    这说明了:小蓝熊检测到异常,主动终止自身并强杀程序。

  • 事件查看器往下找会找到详细错误日志报告



  • 点击“可在此处获取这些文件”下方的本地链接,找到问题日志报告的文本文档


  • 报告比较长我就不完整放了,关键信息就这么两句:
    EventType=BEX64 异常代码:c0000005 故障模块:StackHash_8d09 异常偏移:PCH_BA_FROM_ntdll+0x162924
    1. BEX64
      这是个在拦截非安全代码或注入行为时的一个异常类型,比如非法写入到只读或无权内存区域、第三方DLL注入导致崩溃、程序执行了从堆栈读取来的地址,但该地址是无效的(比如栈损坏),总之表示缓冲区溢出异常,典型的内存问题,证实了之前的猜想。

    2. c0000005
      前面写了,表示缓冲区溢出、空指针解引用等

    3. StackHash_8d09
      意思是“堆栈哈希崩溃”,并且崩溃点不在特定模块,而是出现在一个经过ASLR地址随机化的地方,大多时候这种堆栈哈希错误是由外部DLL注入或栈破坏导致的

    4. PCH_BA_FROM_ntdll+0x162924
      这个标识有两个部分:
      PCH_BA_FROM_开头说明此地址是从预编译头文件(PCH)中恢复的代码地址,也可能是优化编译过程中转义的异常地址
      ntdll.dll是Windows最底层的用户态系统库,通常程序不直接调用,崩溃发生在ntdll.dll内部,说明是调用系统 API 时触发的错误。

  • 小蓝熊在一次崩溃后会显示错误代码,我的是Error 30005,可以在它们官网查询这个错误代码的具体含义:


    可以看到,这个错误意味着:“Easy Anti-Cheat 服务无法访问关键资源,很可能是因为其他人持有它们的控制权。”

    总结:游戏进程在加载后,通过小蓝熊尝试访问资源时,被系统中某个程序(或驱动)以独占/Hook 方式占用了这些资源,从而触发了非法访问(c0000005)+DEP 防护(BEX64)+ 堆栈哈希崩溃。




个人原因
结合上面的结论,最终就好摸排多了。我个人的原因是,因为我打黑夜君临是和亲友联机语音的,而我的语音服务启动了独占 WASAPI。(WASAPI有两种模式,一个共享一个独占,我开了独占)。
如果程序独占使用了AudioClient::Initialize(..., AUDCLNT_SHAREMODE_EXCLUSIVE, ...),就会让系统返回AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED
虽然黑夜君临连局内语音都没有,但是小蓝熊还是会检查,尤其WASAPI本质还是COM接口,若被锁定或 COM 线程未释放,小蓝熊认为设备被篡改,而小蓝熊作为反作弊软件,就主动结束了程序——如procmon所监控到的那样。
解决方法就是切成共享模式就行了,到现在高强度打了14个小时都没触发闪退。


虽然闪退表象许多人可能是共通的,但是原因可能每个人的系统环境和后台服务都不一样,请自行按错误日志排查问题。
因为很多人都有闪退问题,但是我其实并不觉得每个人和我闪退原因这么巧合地和我一样都是wasapi独占问题,就像有人开腾讯软件闪退,而我挂着QQ没什么问题(可能是QQ进程占用的服务不一样)。而且也有人无语音也触发了这种闪退,也有可能是其它服务独占or其它问题。
每个人的系统环境和后台服务都不一样,请按系统内的具体错误日志和procmon程序监控,具体分析来排查问题。

但是我觉得大体思路是正确的,按这个思路走大多数都能找到自己的问题所在。
更新
结论:更新bios解决
需要更新最新版本的bios,我是ROG的主板,不同厂商提供的主板support不一样,自行去对应主板厂商站点下载更新bios文件更新一下bios。如果有启用bitlocker保护记得备份bitlocker恢复密钥并在操作系统挂起bitlocker加密。



完全更新完成后再关机->断电拔电源->主板上清除 CMOS->通电重启

然后进入安全模式,以管理员身份执行一次sfc /scannow,问题解决。启用WASAPI也不会闪退了。
如果还没有解决可以把内核隔离的强制堆栈保护关闭,只开启内存完整性
7 Comments
King.Yu.Law 23 Jul @ 2:10am 
更新bios和扫描都试过依旧是有崩溃问题。
目前是10、11官方系统镜像双系统,目前观察得出结论就是我的11系统玩起来出问题频率比10高很多。10是两星期前全新安装的,就是为了看看是不是系统问题,没安装任何其他软件,结果还是会遇到。不过崩溃的方式和11不太一样,10是卡住几秒后闪退,11是直接闪退。看报告起因和11差不多。

超频什么的都还原默认了,个人也不觉得是硬件问题,并且其他用到EAC的游戏都没遇到这种现象,法环本体也是,完全没遇到过。也许是bios问题也说不定,但是一个个老版本去尝试碰运气闪退也不太现实。

目前就只能归咎于小蓝熊和本体某些方面出了问题,毕竟其他游戏都没遇到问题。看看以后更新会不会修复,不过希望不大,如果官方知道是什么问题,也不至于到现在都还没修复。
Cattolina  [author] 22 Jul @ 1:03am 
>>King.Yu.Law
只能说闪退是EAC的原因,我这边是删除小蓝熊玩单机是不闪退的,个人认为是小蓝熊无法使用系统资源造成的崩溃。

>>Salted Fish
对的,确实是更新bios后,在安全模式的powershall执行一次sfc /scannow能找出错误的系统文件解决了。

我有玩另一款网游,那个不闪退但是会误判我作弊。我直觉上这两个游戏的问题原因可能是一致的,更新bios后那个游戏也不误判我作弊了。
Salted Fish 21 Jul @ 12:01pm 
我是最后更新了主板最新BIOS后(去年8月份版本更新到今年4,5月份的),闪退问题才解决了
King.Yu.Law 21 Jul @ 1:31am 
这个EOS也是原因之一吗?目前看事件报告都是跟你上面那个差不多,至于是什么原因我目前还没找到,看了几个报告里面dll都是系统和steam目录里面的,应该没有什么第三方注入。看到有rtss的注入,连同小飞机关掉虽然闪退频率低了,但依旧会遇到,有时候遇到还是重启游戏会连着闪退。
Pandorem sous-côté 18 Jul @ 12:52pm 
Merci pour le guide, hâte du prochain
Winner 17 Jul @ 5:15am 
历害历害
鲨人狂魔鼠尾草 16 Jul @ 6:13pm 
nb