当前位置: 首页 > news >正文

记一次炉石传说记牌器 Crash 排查经历

大家好这里是 Geek技术前线。最近在打炉石过程中遇到了HSTracker记牌器的一个闪退问题,尝试性排查了下原因。这里简单记录一下

最近炉石国服回归;由于设备限制,我基本只会在 Mac 上打炉石。并且由于主要打竞技场,所以记牌器是必不可少的辅助工具。而 Mac 上的记牌器只有HSTracker能用

但是最近使用HSTracker记牌器却发现一个经常闪退的问题,并且重登多次又会恢复正常。

HSTracker工程是开源的。带着好奇心和问题实在太影响体验了,我就想着能不能本地把记牌器的代码跑起来并看看具体是什么原因导致的闪退

代码准备

按照官方的贡献指南操作

# 拉取代码
git clone https://github.com/HearthSim/HSTracker.git
# 安装 swiftlint
brew install swiftlint

IDE 安装

HSTracker 是使用 Swift 开发的 macos 应用。

这里需要先进行 xcode安装。需要注意这里由于HSTracker有一个依赖包AppCenterxcode 16似乎编不起来(有一个头文件找不到的报错,网上也有相关的 issue,我就踩坑了),必须安装 xcode 15

代码跑起来

报错 1 No “Developer ID Application” signing certificate matching team ID

这时候 xcode 点击运行,会遇到第一个报错

这个报错官方文档也有提醒,我们只需要修改相应的 signing 信息即可

报错 2 Relove Package卡主动不了

由于很多依赖和资源信息都是托管到 github,切换到科学上网下进行。

切换后 xcode 仍卡主在Relove Package

关闭 xcode 后命令行执行xcodebuild -resolvePackageDependencies -scmProvider system完成后重新打开 xcode

报错 3 安装依赖报错wget command not found

macos 上默认没有 wget 命令,而记牌器构建会使用这个命令去拉取一些资源。

解决:使用brew install wget安装wget;由于 xcode 默认情况下的环境变量 PATH 不包含 homebrew 安装路径,需要额外使用一个软链接将 homebrew 下的 wget 软链接到 bin 目录下

which wget
# /opt/homebrew/bin/wget
ln -s /opt/homebrew/bin/wget /usr/local/bin

报错 4

记牌器本身的编译产物还是基于 x86 架构。 M1 mac 上需要切换 Rosetta 模式下运行

Rosetta 是苹果公司为其基于 Apple Silicon(如 M1 和 M2 芯片)的 Mac 计算机提供的一个兼容层。它的主要功能是允许运行针对 Intel 架构编写的应用程序。Rosetta 使得开发者和用户在过渡到新的硬件架构时,能够继续使用现有的 Intel 应用程序,而不需要立即对其进行重新编译

至此,我们的记牌器终于跑起来了~

代码修复

在折腾了将近一小时才把代码跑起来之时。进入喜闻乐见的 15 分钟排队

排队完成登入后进入断点调试,直接打上 crash 断点。开一局游戏打了几个回合后很快就触发了 crash

很快发现了报错是在mirror?.getCardChoices中,给数组插了一个空对象

通过代码排查,这个方法不是记牌器实现的方法,而是另一个 HearthMirror 库(应该是一个独立的进程用来读取炉石客户端的运行时数据)的方法给记牌器调用。当然最好的修复是解决getCardChoices的实现,但由于由于这里 HearthMirror 本身似乎没有开源(至少在 github 也没找到相关源码)

只能尝试加 try/catch 看是否异常时捕获住还能是否运行正常。事实证明这也是能够成功的

不过这里通过尝试和查阅资料学习到了一个 iOS 开发的知识点。由于这里是 OC NSException而 Swift 是无法直接 try/catch 捕获 OC 异常。

需要通过一个桥接 OC 方法来实现在 Swift 对 OC 方法的异常处理。在HSTracker-Bridging-Header.h中引入桥接头文件

// HSTracker/Utility/ExceptionCatcher.h
#import <Foundation/Foundation.h>NS_ASSUME_NONNULL_BEGIN@interface ExceptionCatcher : NSObject+ (BOOL)catchException:(void(^)(void))tryBlock error:(__autoreleasing NSError **)error;@end
// HSTracker/Utility/ExceptionCatcher.h
#import "ExceptionCatcher.h"@implementation ExceptionCatcher+ (BOOL)catchException:(void(^)(void))tryBlock error:(__autoreleasing NSError **)error {@try {tryBlock();return YES;}@catch (NSException *exception) {*error = [[NSError alloc] initWithDomain:exception.name code:0 userInfo:exception.userInfo];return NO;}
}@end// HSTracker/HSTracker-Bridging-Header.h
#import "ExceptionCatcher.h"

在 swift 中对mirror?.getCardChoices()进行异常捕获

最后问题成功修复,实测了多局也没有再复现 crash 的问题,并且mirror?.getCardChoices()的报错本身捕获也并不会实际有记牌器功能本身上的问题

最后

最后也把这个发现通过 issue 反馈给了作者和提了个加了 try/catch 的 PR。

当然这个 PR 也不会合入,因为修复getCardChoices的实现即可,但是这个排查的过程还是学习到了不少有趣的知识

作者也很快给了答复并且发布新版3.0.6修复了这个问题

相关文章:

记一次炉石传说记牌器 Crash 排查经历

大家好这里是 Geek技术前线。最近在打炉石过程中遇到了HSTracker记牌器的一个闪退问题&#xff0c;尝试性排查了下原因。这里简单记录一下 最近炉石国服回归&#xff1b;由于设备限制&#xff0c;我基本只会在 Mac 上打炉石。并且由于主要打竞技场&#xff0c;所以记牌器是必不…...

精益驱动的敏捷开发

1. 什么是精益&#xff1f;精益能给软件开发带来什么&#xff1f; 精益是一种起源于制造业的管理哲学&#xff0c;尤其是从丰田的生产体系中发展而来。它的核心目标是通过最小化浪费、提高效率和优化流程来实现高效的生产。精益的核心原则包括&#xff1a; 消除浪费&#xff…...

SolidWorks机器转ROS2 URDF

文章目录 开发环境SolidWords插件使用生成urdf文件之后的处理CMakeLists文件修改package.xml变更Launch更改运行 开发环境 Linux系统&#xff1a;Ubuntu 22.04 Ros2版本&#xff1a;humble Solidwords版本&#xff1a;2023 &#xff08;2019以上版本应该都是可以的&#xff09…...

(Linux驱动学习 - 6).Linux中断

一. Linux 中断 API 函数 1.中断号 每个中断都有一个中断号&#xff0c;通过中断号即可区分不同的中断&#xff0c;有的资料也把中断号叫做中 断线。在 Linux 内核中使用一个 int 变量表示中断号。 2.申请中断 - request_irq 函数原型&#xff1a; int request_irq(unsigne…...

SpringBoot驱动的明星周边产品电商解决方案

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

C++、Ruby和JavaScript

C C最初被称为带类的C, 兼容C的语法&#xff0c;此既是C得以流行的前提&#xff0c;也是C某些语法被捆绑的根源。C的来源于C语言的递增运算符&#xff0c;代表增加&#xff0c;意义为扩展。 C的历史 C类的设计思想来源于Simula. Simula为模拟的意思&#xff0c;被称为最早的面向…...

32单片机 低功耗模式

以下是一个基于STM32的低功耗模式示例代码&#xff0c;展示如何将STM32微控制器置于低功耗模式&#xff0c;并在特定条件下唤醒它。这个示例使用的是STM32 HAL库。 ### 示例代码&#xff1a;进入睡眠模式并使用外部中断唤醒 c #include "stm32f4xx_hal.h" // 函数声明…...

501、二叉搜索树中的众数

1、题目描述 . - 力扣&#xff08;LeetCode&#xff09; 要求&#xff1a;给一个包含重复值的BST&#xff0c;找出并返回BST中的众数(出现频次最高的元素)。 注&#xff1a;如果树中有不止一个众数可以按任意顺序返回&#xff0c;即如果有多个众数多个都要返回。 ps&#xff1…...

【洛谷】P2330 [SCOI2005] 繁忙的都市 的题解

【洛谷】P2330 [SCOI2005] 繁忙的都市 的题解 题目传送门 题解 水最小生成树&#xff0c;发现可以水一堆黄题qaq 这题显然就是求最大边权最小的生成树&#xff0c;而用 Kruskal 很容易证明这就是最小生成树&#xff0c;考虑一下这个算法每次取的都是不构成环的最小边即可&a…...

第18场小白入门赛(蓝桥杯)

第 18 场 小白入门赛 6 武功秘籍 考察进制理解。 对于第 i i i 位&#xff0c;设 b i t i x bit_ix biti​x &#xff0c;每一位的最大值是 b j b_j bj​ &#xff0c;也就是说每一位是 b j 1 b_j1 bj​1 进制 &#xff0c;那么第 i i i 位的大小就是 x ∑ j i 1…...

Redission · 可重入锁(Reentrant Lock)

前言 Redisson是一个强大的分布式Java对象和服务库&#xff0c;专为简化在分布式环境中的Java开发而设计。通过Redisson&#xff0c;开发人员可以轻松地在分布式系统中共享数据、实现分布式锁、创建分布式对象&#xff0c;并处理各种分布式场景的挑战。 Redisson的设计灵感来…...

初阶C语言-指针

1.指针是什么&#xff1f; 理解指针的两个要点&#xff1a; 1.指针是内存中一个最小单元的编号&#xff0c;也就是地址 2.口头语中说的指针&#xff0c;通常是指指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff0c;口语中说的指针通常是指…...

论文笔记:微表情欺骗检测

整理了AAAI2018 Deception Detection in Videos 论文的阅读笔记 背景模型实验可视化 背景 欺骗在我们的日常生活中很常见。一些谎言是无害的&#xff0c;而另一些谎言可能会产生严重的后果。例如&#xff0c;在法庭上撒谎可能会影响司法公正&#xff0c;让有罪的被告逍遥法外。…...

智能家居有哪些产品?生活中常见的人工智能有哪些?

智能家居有哪些产品? 1、智能照明设备类&#xff1a;智能开关、智能插座、灯控模块、智能空开、智能灯、无线开关。 2、家庭安防类&#xff1a;智能门锁、智能摄像机、智能猫眼、智能门铃。 3、智能传感器类&#xff1a;烟雾传感器、可燃气体传感器、水浸传感器、声光报警器…...

洗车行软件系统有哪些 佳易王洗车店会员管理系统操作教程#洗车店会员软件试用版下载

一、前言 【试用版软件下载可点击本文章最下方官网卡片】 洗车行软件系统有哪些 佳易王洗车店会员管理系统操作教程#洗车店会员软件试用版下载 洗车管理软件应用是洗车业务的得力助手&#xff0c;实现会员管理及数据统计一体化&#xff0c;助力店铺高效、有序运营。 洗车项…...

【Java】springboot 项目中出现中文乱码

在刚创建的springboot项目中&#xff0c;出现乱码&#xff0c;跟走着解决一下 1、Ctrl Shift S 打开idea设置&#xff0c;根据图片来&#xff0c;将③④这三个地方都修改为UTF-8 2、返回配置查看&#xff0c;解决...

开放式耳机是什么意思?漏音吗?开放式的运动蓝牙耳机推荐

目前运动耳机市场主要分为入耳式、骨传导和开放式三类。入耳式耳机占比30%-40%&#xff0c;虽目前占比较大&#xff0c;但因在运动场景下有闷塞感、出汗不适、屏蔽外界环境音带来安全隐患等缺点&#xff0c;占比会逐渐下降。 骨传导耳机占比也为30%-40%&#xff0c;其不堵塞耳…...

如何优雅的处理NPE问题?

1.什么是NPE&#xff1f; NPE&#xff0c;即NullPointerException&#xff0c;是开发中最常见的问题之一&#xff0c;有必要知道如何正确地处理NPE。 对于 Java 开发者来说&#xff0c;null 是一个令人头疼的类型&#xff0c;一不小心就会发生 NPE &#xff08;空指针&#xf…...

k8s 中存储之 NFS 卷

目录 1 NFS 卷的介绍 2 NFS 卷的实践操作 2.1 部署一台 NFS 共享主机 2.2 在所有k8s节点中安装nfs-utils 2.3 部署nfs卷 2.3.1 生成 pod 清单文件 2.3.2 修改 pod 清单文件增加 实现 NFS卷 挂载的 参数 2.3.3 声明签单文件并查看是否创建成功 2.3.4 在 NFS 服务器 创建默认发布…...

Redis中BitMap实现签到与统计连续签到功能

服务层代码 //签到Overridepublic Result sign() {//1.获取当前登录的用户Long userId UserHolder.getUser().getId();//获取日期LocalDateTime now LocalDateTime.now();//拼接keyString keySuffix now.format(DateTimeFormatter.ofPattern(":yyyyMM"));String …...

用Arduino和TCS34725颜色传感器做个桌面小助手:自动识别物体颜色并控制RGB灯带

用Arduino和TCS34725打造智能色彩互动系统&#xff1a;从硬件搭建到场景应用 在创客圈里&#xff0c;色彩交互一直是个充满魅力的领域。想象一下&#xff1a;当你把一杯橙汁放在桌面上&#xff0c;周围的灯光自动变成温暖的橙色&#xff1b;放上一本蓝色封面的书&#xff0c;工…...

3.多表关联在电商数据分析中的核心价值

多表关联在电商数据分析中的核心价值 第1章 多表关联、子查询与行列转换在电商数据分析中的核心价值 1.1 为什么单表查询不够用 我刚开始做数据分析的时候&#xff0c;以为SQL就是在一张表上做筛选和汇总。直到有一天&#xff0c;运营问我&#xff1a;“这批高价值用户&#xf…...

2026届学术党必备的十大AI辅助写作助手解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek “降AI”是要借助技术手段&#xff0c;去降低文本里人工智能生成内容的可识别程度&#xff0…...

ESP32智能硬件开发实战指南:从环境搭建到AI功能落地

ESP32智能硬件开发实战指南&#xff1a;从环境搭建到AI功能落地 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 如何在复杂的硬件开发中快速实现AI功能集成&#xf…...

终极指南:一键解决iPhone USB网络共享驱动问题

终极指南&#xff1a;一键解决iPhone USB网络共享驱动问题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mirrors/ap…...

太方便了!农村自建房设计新神器,二三维设计 + 扫码看模型

还在为农村自建房设计发愁&#xff1f;手绘图纸看不懂、修改慢、施工易出错&#xff1f;飞扬集成设计系统&#xff0c;专为农村自建房打造&#xff0c;一键实现二三维一体化设计&#xff0c;还能扫码查看轻量化 3D 模型&#xff0c;让建房更高效、更直观、更省心&#xff01;一…...

机器学习 01高斯混合模型(Gaussian Mixture Model:GMM)_基础知识与认识

公式&#xff1a; 应用&#xff1a;高斯混合模型本质是用多个高斯分布叠加&#xff0c;去拟合任意复杂的数据分布&#xff0c;常用来做聚类、密度估计、数据生成、异常检测等&#xff1a; 第一步&#xff1a;基本认识“高斯模型”&#xff1a;从“一个高斯”开始 什么是高斯分…...

肿瘤免疫微环境解析:8大免疫浸润工具实战指南

1. 肿瘤免疫微环境分析的核心价值 当你拿到一份肿瘤样本的转录组数据时&#xff0c;最令人兴奋的莫过于揭开它的免疫面纱——那些隐藏在肿瘤组织中的免疫细胞究竟在做什么&#xff1f;这就是免疫浸润分析的价值所在。想象一下&#xff0c;肿瘤组织就像一座复杂的城市&#xff0…...

、SEATA分布式事务——XA模式

指令替换 项目需求&#xff1a;将加法指令替换为减法 项目目录如下 /MyProject ├── CMakeLists.txt # CMake 配置文件 ├── build/ #构建目录 │ └── test.c #测试编译代码 └── mypass2.cpp # pass 项目代码 一&#xff0c;测试代码示例 test.c // test.c #includ…...

CD3抗体如何成为双抗药物的核心靶点?

一、双特异性抗体药物为何发展迅猛&#xff1f;双特异性抗体&#xff08;BsAb&#xff09;是一类能够同时特异性结合两个不同抗原或抗原表位的人工工程抗体。其通过同时阻断两个靶点介导的生物学功能&#xff0c;或将表达不同抗原的细胞拉近&#xff0c;实现单一抗体难以完成的…...