iOS开发笔记之键盘、静态库、动画和Crash定位

2020-01-21 05:19:42于海丽

从上面的寄存器信息,我们可以拿到x0、x1、x2的寄存器值为0xAA、0xBB、0xCC,从而还原出导致crash的函数为memcpy(0xaa, 0xbb, 0xcc);。

(这里memcpy的三个参数是我特意构造的,以便描述问题)

这里有两种crash的可能性:

1、参数1写数据非法;

2、参数2读数据非法;

先看一个类似的问题,下面的代码有什么问题?


int *p1=malloc(1024);
int *p2=malloc(1024);
memcpy(p1, p2, 1025);

答案是:大多数情况下正常运行,少数情况下会Crash。

Crash本质是堆内存访问越界,但堆内存空间到栈内存空间的距离不固定,如果p1+1025仍有写权限,p2+1025仍有读权限,则不会出现crash的情况。

ios,键盘动画,crash,定位

附:
实际开发中,寄存器x2+寄存器x5的值,才是真正的memcpy的第三个参数。
x2: 0x00000000000003e0 + x5: 0x0000000000000020 = 0x0000000000000400 = 1024
怀疑是苹果对memcpy的方法做了修改:
当 第二个参数是堆内存地址的时候,会进行截断;
当 第二个参数是非法地址时(比如0x00000000000000bb),就不会进行截断;

总结

遇到问题是常态,如果能从解决问题中学到知识,以及用问题去验证知识,那么问题也可以成为学习进步的一部分。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ASPKU的支持。



注:相关教程知识阅读请移步到IOS开发频道。