问题
在项目中打了全局异常断点,在app运行的时候直接停在main函数中,直接无视断点继续运行app还可以继续运行。有时候我们会自动忽略或者关掉全局异常断点,那么这个是什么问题导致的呢?

这个时候我们并不能发现是哪个地方出现了问题,
首先呢,确保自己的堆栈信息是没有经过筛选的

我们会发现堆栈信息中列表中出现了大量的和Font相关的堆栈信息,可以猜测更字体有关。
有一种更精准的方法,使用调试器来跟踪应用程序中的可疑字体。
第一步
点击FPFontCreateFontsWithPath () 这个堆栈信息

第二步
会看到断点停留在汇编指令 ,以及这个FPFontCreateFontsWithPath 的函数签名
0x189cbb008 <+196>: bl 0x189cbb4fc ; TFont::CreateFontEntitiesForFile(char const*, bool, TSimpleArray<TFont*>&, bool, short, char const*)
0x189cbb00c <+200>: ldr x21, [sp, #0x30]
bl指令(带返回值的跳转指令):
将下一条指令的地址存储到lr(x30)寄存器中
跳转到标记处开始执行代码
第三步
我的手机是ARM64,或者你用的模拟器(x86_64)不过两者之间的汇编指令会有不同
通用寄存器
64bit的:x0~x28,29个寄存器每个寄存器都是64位的,64位就是8 个字节,一个寄存器最多能放8个字节的数据
方法的参数都储存在寄存器上面,bl指令执行完成后将下一条的指令的地址存储到lr ,那我们先从 x28 寄存器查看 鼠标右击print
会发现控制台
Printing description of $x28:
file:///var/containers/Bundle/Application/481B4BE4-65FC-48E7-9609-A88E46A5C1A5/Broker-Swift.app/PingFang.tt
我们发现我们工程中存在平方字体,导致我们每次启动App全局断点都会在main函数停留。
我们可以在工程中搜索PingFang 也可以控制台搜索 grep -r "PingFang"
最后
然后我们把这个字体改成系统字体就OK了~
偷懒的话,把全局断点Exceptions 从All 改成 Objective-C 也能搞定~
网友评论