BSBacktraceLogger

iOS 轻量级调用栈分析器
授权协议 GPL
开发语言 Objective-C
所属分类 开发工具、 代码管理分析/审查/优化
软件类型 开源软件
地区 不详
投 递 者 微生博简
操作系统 iOS
开源组织
适用人群 未知
 软件概览

BSBacktraceLogger,一款轻量级调用栈分析器,用于记录线程的调用栈。它只有一个类,四百行代码。它支持现有所有模拟器、真机的 CPU 架构,可以获取任意线程的调用栈,因此可以在检测到 runloop 检测到卡顿时获取卡顿处的代码执行情况。

示例代码:

#import "BSBacktraceLogger.h"
- (void)viewDidLoad {
    [super viewDidLoad];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        BSLOG  // 打印当前线程的调用栈
        BSLOG_ALL  // 打印所有线程的调用栈
        BSLOG_MAIN  // 打印主线程调用栈
    });
    [self foo];
}
- (void)foo {
    [self bar];
}
- (void)bar {
    while (true) {
        ;
    }
}

定义了三个宏用于快速输出,或者调用 [BSBacktraceLogger bs_backtraceOfCurrentThread] 等函数获取字符串格式的调用栈。

样例

上述代码中,BSLOG_MAIN 这个宏的输出结果如下:

2016-08-27 18:33:20.017 BSBacktraceLogger[25215:862569] Backtrace of Thread 1803:
KtBacktraceLogger               0x10b831f4c -[ViewController bar] + 12
KtBacktraceLogger               0x10b831f2b -[ViewController foo] + 43
KtBacktraceLogger               0x10b831fe0 -[ViewController viewDidLoad] + 128
UIKit                           0x10c813984 -[UIViewController loadViewIfRequired] + 1198
UIKit                           0x10c813cd3 -[UIViewController view] + 27
UIKit                           0x10c6e9fb4 -[UIWindow addRootViewControllerViewIfPossible] + 61
UIKit                           0x10c6ea69d -[UIWindow _setHidden:forced:] + 282
UIKit                           0x10c6fc180 -[UIWindow makeKeyAndVisible] + 42
UIKit                           0x10c670ed9 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4131
UIKit                           0x10c677568 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1769
UIKit                           0x10c674714 -[UIApplication workspaceDidEndTransaction:] + 188
FrontBoardServices              0x10f0e18c8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 24
FrontBoardServices              0x10f0e1741 -[FBSSerialQueue _performNext] + 178
FrontBoardServices              0x10f0e1aca -[FBSSerialQueue _performNextFromRunLoopSource] + 45
CoreFoundation                  0x10c1e8301 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
CoreFoundation                  0x10c1de22c __CFRunLoopDoSources0 + 556
CoreFoundation                  0x10c1dd6e3 __CFRunLoopRun + 867
CoreFoundation                  0x10c1dd0f8 CFRunLoopRunSpecific + 488
UIKit                           0x10c673f21 -[UIApplication _run] + 402
UIKit                           0x10c678f09 UIApplicationMain + 171
KtBacktraceLogger               0x10b8338ff main + 111
libdyld.dylib                   0x10ea9c92d start + 1

说明

Xcode 的调试输出不稳定,有时候存在调用 NSLog() 但没有输出结果的情况,建议前往 控制台 中根据设备的 UUID 查看完整输出。

真机调试和使用 Release 模式时,为了优化,某些符号表并不在内存中,而是存储在磁盘上的 dSYM 文件中,无法在运行时解析,因此符号名称显示为

  • Xcode 的调试输出不稳定,有时候存在调用 NSLog() 但没有输出结果的情况,建议前往 控制台 中根据设备的 UUID 查看完整输出。 真机调试和使用 Release 模式时,为了优化,某些符号表并不在内存中,而是存储在磁盘上的 dSYM 文件中,无法在运行时解析,因此符号名称显示为 原理:用线程 抓取堆栈信息 https://github.com/bestswifter/BSBacktra

 相关资料
  • 问题内容: 我有一个将要推送的特定格式的XML文档。该文档将始终是同一类型,因此非常严格。 我需要对此进行解析,以便将其转换为JSON(嗯,这是一个混蛋版本,以便其他人可以将其与DOJO一起使用)。 我的问题是,我应该使用非常快速的轻量级(不需要SAX等)XML解析器(有什么想法吗?)还是编写我自己的,基本上可以转换为StringBuffer并在数组中旋转?基本上,我假设所有HTML解析器都将旋转

  • 本文向大家介绍php轻量级的性能分析工具xhprof的安装使用,包括了php轻量级的性能分析工具xhprof的安装使用的使用技巧和注意事项,需要的朋友参考一下 一、前言   有用的东西还是记录下来吧,也方便以后的查询;这次记录一下xhprof的安装使用;   xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低,   还可以用在生产环境中,也可

  • 本文向大家介绍超好用轻量级MVC分页控件JPager.Net,包括了超好用轻量级MVC分页控件JPager.Net的使用技巧和注意事项,需要的朋友参考一下 JPager.Net  MVC好用的轻量级分页控件,好用到你无法想象,轻量到你无法想象。 JPager.Net  MVC好用的轻量级分页控件,实现非常简单,使用也非常简单。 JPager.Net  MVC好用的轻量级分页控件,代码精心推敲,经多

  • 主要内容:使用普通函数创建 goroutine,使用匿名函数创建goroutine在编写 Socket 网络程序时,需要提前准备一个线程池为每一个 Socket 的收发包分配一个线程。开发人员需要在线程数量和 CPU 数量间建立一个对应关系,以保证每个任务能及时地被分配到 CPU 上进行处理,同时避免多个任务频繁地在线程间切换执行而损失效率。 虽然,线程池为逻辑编写者提供了线程分配的抽象机制。但是,如果面对随时随地可能发生的并发和线程处理需求,线程池就不是非常直观和方便了。能否

  • Jenkins Pipeline插件有一个称为“轻量级签出”的功能,其中主服务器仅从repo中提取Jenkinsfile,而不是整个repo。配置屏幕中有一个相应的复选框。我想在多分支管道中进行轻量级签出,但我在多分支配置屏幕中没有看到复选框。有什么想法如何实现这一点吗?我注意到一些关闭的问题表明此功能可用,但我无法找到任何有关如何实现它的细节。 相关资料: https://issues.jenk

  • 本文向大家介绍轻量级javascript 框架Backbone使用指南,包括了轻量级javascript 框架Backbone使用指南的使用技巧和注意事项,需要的朋友参考一下 Backbone 是一款基于模型-视图-控制器 MVC 模式的轻量级javascript 框架 ,可以用来帮助开发人员创建单页Web应用。 借助Backbone 我们可以使用REST的方式来最小化客户端和服务器间的数据传输,

  • 问题内容: JPanel和JFrame有什么区别,以及与轻量级,重量级的关系? 问题答案: JPanel是允许将多个UI组件放在一起的容器。JFrame是使用Swing编写的窗口。 所有的Swing组件都是所谓的“轻型”组件,因为它们是用Java编写的。例如,如果您运行Swing应用程序并尝试使用UI分析工具(例如Windows中的WinSpy)对其进行分析,则只会看到一个元素:窗口(JFrame

  • 问题内容: 题 我正在寻找Java内存对象缓存API。有什么建议吗?您过去使用过什么解决方案? 当前 现在,我只是在使用地图: 要求 我需要扩展缓存以包括以下基本功能: 最大尺寸 生存时间 但是,我不需要更复杂的功能,例如: 来自多个进程的访问(缓存服务器) 持久性(到磁盘) 意见建议 内存中缓存: Guava CacheBuilder-活动开发。请参阅此演示文稿。 LRUMap-通过API配置。