iOS-如何定位没有头绪的崩溃

原文链接,原文日期:2018-08-14
译者:lbj

当我在编译运行 FastScripts时出现了如下问题

FastScripts [...] is calling TIS/TSM in non-main thread environment,   
ERROR : This is NOT allowed. Please call TIS/TSM in main thread!!!

不知道是什么原因导致的这个问题。
有时候苹果添加了想这样的log信息都提供了足够的解决信息。有的是建议我们停止使用过时的方法、或者像现在这种场景中,提供一个象征性的设置为0的断点并且完全对应了代码所在。例如,我打开控制台应用程序的快速调查显示:

default 11:54:18.482226 -0400   com.apple.WebKit.WebContent 
Set a breakpoint at SLSLogBreak to catch errors/faults as they are logged.

这个特定的警告好像和我的程序并没有什么关系,但如果是这样的,我需要去学习更多有关TIS/TSM 相关的东西,但是我并不知道改怎么做,我甚至都不知道用了TIS/TSM ,什么是TIS/TSM ??

在苹果平台工作了足够久之后我知道了TSM代表的是文本服务的工具,然而我还是不知道是否用过这个东西、或正在我的程序中使用着这个框架、这是苹果还是我在使用的东西?

理想情况下我们可以通过设置断点来打印相关信息,但现在的情况出乎意料的困难啊。我们有NSLog, os_log, printf, fprintf, write等方法去获取信息。我可以通过全面的方法捕捉任何写入控制台的方法,但是我是否需要通过这种方法去获取信息呢?(在这种特殊的情况下,我深入研究了CFLog)。

这是一个场景,结合lldb强大的“正则表达式断点”和“断点指令”可以帮助很大。早在我的应用程序的启动,警告消息记录,我就进入了lldb,添加断点:

(lldb) break set -r TIS|TSM.*

我觉得无论是什么函数导致这个问题都会包含与这个前缀相关的框架,这是一个比较可行的猜测。

Breakpoint 5: 634 locations.

点击继续让我的程序继续运行,但是它有634的相关的断点,时不时的出现。我更倾向于让它自己处理并自行整理出细节:

(lldb) break command add 5
Enter your debugger command(s).  Type 'DONE' to end.
> bt
> c
> DONE
(lldb) c
Process 16022 resuming

break command add 的功能是
 Add LLDB commands to a breakpoint, to be executed whenever the breakpoint
     is hit.  If no breakpoint is specified, adds the commands to the last
     created breakpoint.

bt 的功能是显示当前堆栈

c 的功能是继续执行所有进程

这一系列命令的作用是在命中断点5的时候调用bt方法获取调用堆栈,然后继续运行,在程序运行之后,就可以查看最近被调用的命令了。

 thread #7, stop reason = breakpoint 5.568
    frame #0: 0x00007fff2cd520fd HIToolbox`TSMGetInputSourceProperty
    frame #1: 0x00000001003faef2 RSFoundation`-[RSKeyboardStatus update](self=0x00006000002b8c00, _cmd="update") at RSKeyboardStatus.m:56
    [...]

Command #2 'c' continued the target.
2018-08-14 12:15:40.326538-0400 FastScripts[16022:624168] pid(16022)/euid(501) is calling TIS/TSM in non-main thread environment, ERROR : This is NOT allowed. Please call TIS/TSM in main thread!!! 

经过查找之后发现以上问题,很显然,这是我的代码,我调用TSM的方法去处理FastScripts的键盘的快捷键功能, thread #7中很显然能够发现这不是处于主线程中,我应该感到羞愧。。。。

但是我很自豪能够通过lldb定位到了问题所在,下次你如果遇到无法定位问题的时候,可以尝试通过基于正则表达式的断点和一系列的命令来确定问题。

总结

当遇到无法定位的问题可以尝试通过lldb和正则来定位问题。
就如原作者遇到了的问题做了如下几点:
1.通过设置一个正则表达式的断点来定位问题;
2.因为有太多满足条件的情况原作者通过lldb批量处理调用堆栈内容;
3.查看日志最终定位到问题。

更多的lldb方法,在lldb中通过help命令去获取

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,050评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,538评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,673评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,622评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,047评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,974评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,129评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,893评论 0 209
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,654评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,828评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,297评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,619评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,326评论 3 243
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,176评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,975评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,118评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,909评论 2 278

推荐阅读更多精彩内容