KSCrash 2.0.0-alpha.5

KSCrash 2.0.0-alpha.5

测试已测试
语言语言 CC
许可证 NOASSERTION
发布最后发布2024年7月

Karl StenerudYury VasileuskiKanstantsin CharnukhaNikolay VolosatovNick HagiKSCrash维护。



KSCrash 2.0.0-alpha.5

  • Karl Stenerud

KSCrash

终极崩溃报告工具

另一个崩溃报告器?为什么要这样做?

因为尽管现有的崩溃报告器可以报告崩溃,但它们还能做很多更多的事情。以下是KSCrash的一些关键特性:

  • 在设备上进行符号化,支持离线重新符号化(适用于许多函数已被修改的iOS版本)。
  • 生成完整的Apple报告,所有字段都已填写。
  • 支持32位和64位模式。
  • 支持所有Apple设备,包括Apple Watch。
  • 处理只能在mach级别捕获的错误,例如堆栈溢出。
  • 追踪未捕获C++异常的真正原因。
  • 处理已崩溃崩溃处理程序本身或用户崩溃处理程序回调中的崩溃。
  • 检测已释放(zombie)对象访问尝试。
  • 恢复僵尸或内存损坏情况下的丢失NSException消息。
  • 检查寄存器上的对象和栈上的对象(C字符串和Objective-C对象,包括ivar)。
  • 提取异常引用的对象信息(如“向实例 0xa26d9a0 发送了未识别的选择器”)
  • 其可插拔的服务器报告架构使其易于适应任何API服务。
  • 输出堆栈内容。
  • 诊断崩溃原因(崩溃医生)。
  • 以JSON格式记录比苹果崩溃报告多得多的信息。
  • 支持包含程序员在崩溃之前和期间提供的额外数据。

KSCrash可以处理以下几种类型的崩溃

  • Mach内核异常
  • 致命信号
  • C++异常
  • Objective-C异常
  • 主线程死锁(实验性)
  • 自定义崩溃(例如,来自脚本语言的)

KSCrash可以向以下服务器报告:

以下是一些它可以生成的报告示例。

有什么新功能?

求助!

近几年我的生活发生了很大变化,我无法再继续给予KSCrash所需的爱。

I want you

我在寻找能够帮助我维护这个包、确保问题得到处理、合并得到适当审查、并保持代码质量高的人。请通过电子邮件(我的邮箱地址[email protected])或在我的#313评论中联系我。

非常非常非常初步的Android支持。

我的意思确实是“初步”。大多数功能不起作用,但可以编译。如果您想尝试,请查看Android子目录。

C++ 异常处理

没错!通常如果你的应用程序由于未捕获的C++异常而终止,你只得到这个

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x9750ea6a 0x974fa000 + 84586 (__pthread_kill + 10)
1   libsystem_sim_c.dylib           0x04d56578 0x4d0f000 + 292216 (abort + 137)
2   libc++abi.dylib                 0x04ed6f78 0x4ed4000 + 12152 (abort_message + 102)
3   libc++abi.dylib                 0x04ed4a20 0x4ed4000 + 2592 (_ZL17default_terminatev + 29)
4   libobjc.A.dylib                 0x013110d0 0x130b000 + 24784 (_ZL15_objc_terminatev + 109)
5   libc++abi.dylib                 0x04ed4a60 0x4ed4000 + 2656 (_ZL19safe_handler_callerPFvvE + 8)
6   libc++abi.dylib                 0x04ed4ac8 0x4ed4000 + 2760 (_ZSt9terminatev + 18)
7   libc++abi.dylib                 0x04ed5c48 0x4ed4000 + 7240 (__cxa_rethrow + 77)
8   libobjc.A.dylib                 0x01310fb8 0x130b000 + 24504 (objc_exception_rethrow + 42)
9   CoreFoundation                  0x01f2af98 0x1ef9000 + 204696 (CFRunLoopRunSpecific + 360)
...

无法追踪异常的类型或出处!

现在使用KSCrash,你可以得到未捕获的异常类型、描述以及它被抛出的位置

Application Specific Information:
*** Terminating app due to uncaught exception 'MyException', reason: 'Something bad happened...'

Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   Crash-Tester                    0x0000ad80 0x1000 + 40320 (-[Crasher throwUncaughtCPPException] + 0)
1   Crash-Tester                    0x0000842e 0x1000 + 29742 (__32-[AppDelegate(UI) crashCommands]_block_invoke343 + 78)
2   Crash-Tester                    0x00009523 0x1000 + 34083 (-[CommandEntry executeWithViewController:] + 67)
3   Crash-Tester                    0x00009c0a 0x1000 + 35850 (-[CommandTVC tableView:didSelectRowAtIndexPath:] + 154)
4   UIKit                           0x0016f285 0xb4000 + 766597 (-[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1194)
5   UIKit                           0x0016f4ed 0xb4000 + 767213 (-[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 201)
6   Foundation                      0x00b795b3 0xb6e000 + 46515 (__NSFireDelayedPerform + 380)
7   CoreFoundation                  0x01f45376 0x1efa000 + 308086 (__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 22)
8   CoreFoundation                  0x01f44e06 0x1efa000 + 306694 (__CFRunLoopDoTimer + 534)
9   CoreFoundation                  0x01f2ca82 0x1efa000 + 207490 (__CFRunLoopRun + 1810)
10  CoreFoundation                  0x01f2bf44 0x1efa000 + 204612 (CFRunLoopRunSpecific + 276)
...

自定义崩溃和堆栈跟踪

你现在可以提交自己的自定义崩溃和堆栈跟踪(比如脚本语言)

- (void) reportUserException:(NSString*) name
                  reason:(NSString*) reason
              lineOfCode:(NSString*) lineOfCode
              stackTrace:(NSArray*) stackTrace
        terminateProgram:(BOOL) terminateProgram;

详情请查看KSCrash.h。

不稳定功能

以下功能应被视为“不稳定”,默认情况下是禁用的

  • 死锁检测

如何构建KSCrash

  1. 选择 KSCrash 模式。
  2. 选择 iOS 设备
  3. Products 菜单中选择 Archive

构建完成后,它将在Finder中显示框架。您可以使用它就像使用其他任何框架一样。

如何使用KSCrash

  1. 将框架添加到您的项目中(或将KSCrash项目作为依赖项添加)

  2. 将以下系统框架和库添加到您的项目中

    • libc++.dylib(新版本中为libc++.tbd)
    • libz.dylib(新版本中为libz.tbd)
    • MessageUI.framework(仅限iOS)
    • SystemConfiguration.framework
  3. 将标志“-ObjC”添加到“其他链接器标志”中的您的“构建设置”

  4. 将以下内容添加到您应用程序委托中的 ![application: didFinishLaunchingWithOptions:] 方法

#import <KSCrash/KSCrash.h>
// Include to use the standard reporter.
#import <KSCrash/KSCrashInstallationStandard.h>
// Include to use Quincy or Hockey.
#import <KSCrash/KSCrashInstallationQuincyHockey.h>
// Include to use the email reporter.
#import <KSCrash/KSCrashInstallationEmail.h>
// Include to use Victory.
#import <KSCrash/KSCrashInstallationVictory.h>

- (BOOL)application:(UIApplication*) application didFinishLaunchingWithOptions:(NSDictionary*) launchOptions
{
KSCrashInstallationStandard* installation = [KSCrashInstallationStandard sharedInstance];
installation.url = [NSURL URLWithString:@"http://put.your.url.here"];

// OR:

KSCrashInstallationQuincy* installation = [KSCrashInstallationQuincy sharedInstance];
installation.url = [NSURL URLWithString:@"http://put.your.url.here"];

// OR:

KSCrashInstallationHockey* installation = [KSCrashInstallationHockey sharedInstance];
installation.appIdentifier = @"PUT_YOUR_HOCKEY_APP_ID_HERE";

// OR:

KSCrashInstallationEmail* installation = [KSCrashInstallationEmail sharedInstance];
installation.recipients = @[@"[email protected]"];

// Optional (Email): Send Apple-style reports instead of JSON
[installation setReportStyle:KSCrashEmailReportStyleApple useDefaultFilenameFormat:YES]; 

// Optional: Add an alert confirmation (recommended for email installation)
[installation addConditionalAlertWithTitle:@"Crash Detected"
                                 message:@"The app crashed last time it was launched. Send a crash report?"
                               yesAnswer:@"Sure!"
                                noAnswer:@"No thanks"];

// OR:

KSCrashInstallationVictory* installation = [KSCrashInstallationVictory sharedInstance];
installation.url = [NSURL URLWithString:@"https://put.your.url.here/api/v1/crash/<application key>"];

[installation install];
    …
}

这将安装崩溃监控系统(该系统拦截崩溃并将报告存储到磁盘)。请注意,还有其他属性您可以设置,并且您可能需要为不同的安装设置这些属性。

一旦您准备发送任何挂起的崩溃报告,请调用以下

[installation sendAllReportsWithCompletion:^(NSArray *filteredReports, BOOL completed, NSError *error)
{
 // Stuff to do when report sending is complete
}];

推荐阅读

如果可能,您应该阅读以下头文件,以充分了解KSCrash具有哪些功能以及如何使用它们

  • KSCrash.h
  • KSCrashInstallation.h
  • KSCrashInstallation(SPECIFIC TYPE).h
  • Architecture.md

了解KSCrash代码库

我在这里写了一篇快速的代码旅行 这里

高级用法

启用设备符号化

设备上的符号化需要在最终构建中包含基本符号。要启用它,转到您的应用构建设置,并将Strip Style设置为调试符号。这样做会增加您的最终二进制文件大小约5%,但您将获得设备上的符号化。

启用高级功能

KSCrash具有高级功能,这在分析野外崩溃报告时非常有用。其中一些涉及细微的权衡,所以大多数默认都是禁用的。

自定义用户数据(KSCrash.h中的userInfo)

您可以通过在KSCrash.h中设置userInfo属性来存储自定义用户数据到下一个崩溃报告。

僵尸检测(KSCrashMonitorType.h中的KSCrashMonitorTypeZombie)

KSCrash能够检测僵尸实例(对已释放对象的悬挂指针)。它是通过记录任何释放对象的地址和类来实现的。它将这些值存储在缓存中,以释放对象的地址为键。这意味着您设置的缓存大小越小,发生哈希碰撞并失去有关先前已释放对象的信息的机会就越大。

启用僵尸检测后,KSCrash还将检测丢失的NSException并打印其内容。某些类型的内存损坏或堆栈损坏崩溃可能会造成异常过早释放,从而进一步阻碍调试应用程序的努力,所以这个特性在某种程度上非常有用。

权衡:旨在添加非常小的开销到对象释放中,并保留一些内存。

死锁检测(KSCrashMonitorType.h中的KSCrashMonitorTypeMainThreadDeadlock)

警告 警告 警告 警告 警告 警告 警告

该特性不稳定!可能会导致误报和应用程序崩溃!

如果你主线程发生死锁,你的用户界面将无响应,用户需要手动关闭应用程序(这种情况下不会生成崩溃报告)。启用死锁检测后,会设置一个看门狗定时器。如果任何操作将主线程保持超过看门狗定时器的持续时间,KSCrash将关闭应用程序并向你显示堆栈跟踪,显示当时主线程正在进行什么操作。

这很好,但你必须小心:应用程序初始化通常在主线程上执行。如果您的初始化代码所需时间超过看门狗定时器,您的应用程序将在启动时被强制关闭!如果您启用此功能,您必须确保您的正常运行代码中没有任何操作将主线程保持超过看门狗值!同时,您可能希望将时间设置得足够低,以避免用户在看门狗触发之前变得不耐烦并手动关闭应用程序!

权衡:死锁检测,但您必须更加注意主线程上运行的操作!

内存检查(在KSCrash.h中使用introspectMemory)

当应用程序崩溃时,通常在内存中有对象和字符串被堆栈、寄存器或甚至异常消息引用。启用后,KSCrash将检查这些内存区域并将它们的内容存储在崩溃报告中。

您也可以指定不应检查的类列表,在KSCrash中设置doNotIntrospectClasses属性。

自定义崩溃处理代码(在KSCrash.h中使用onCrash)

如果您希望在崩溃发生后执行额外的处理(可能是在报告中添加更多的上下文数据),则可以这样做。

但是,您必须确保您只使用异步安全代码,并且首先决不能从此方法中调用Objective-C代码!尽管仍然存在可以做到这一点的情况,但有某些类型的崩溃,如果不遵守此警告, handler代码会导致崩溃处理程序崩溃!请注意,如果发生这种情况,KSCrash将检测到它并 anyway生成完整的报告,尽管您的自定义处理代码可能不会完整运行。

权衡:自定义崩溃处理代码,但您必须小心在其中放入什么!

KSCrash日志重定向

这将KSCrash原本应该输出到控制台的任何内容写入到文件中。我主要是为了调试KSCrash本身使用这一功能,但这也可能对其他目的有用,因此我公开了一个API来供调用。

示例

工作空间中包括了一些示例应用程序,这些程序演示了KSCrash的常见使用方式。请在每个应用程序的AppDelegate.m文件顶部查看其描述。

许可证

版权所有(c) 2012 Karl Stenerud

以下条件下,许可任何获得此软件及其关联文档文件(“软件”)的个人在不受限制的情况下处理该软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本,并允许向软件提供方从事上述活动

如将模板文件本身进行再分发,请在文档中包含以上版权声明和许可声明(但不在使用模板文件构建的项目中包含)。

软件按“现状”提供,不提供任何形式的保证,明示或暗示,包括但不限于适销性、针对特定目的的适应性以及非侵权性。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论此类索赔、损害或其他责任是由于合同、侵权或其他方式产生的,无论与软件或软件的使用或其他方式有关。