- 在 Xcode 点运行以后出现 iOS QQ模拟器器然後QQ模拟器器黑屏,什么也不显示也不提示(使用 CoreLocation 以后也不提示位置请求)
- 这时候在 Xcode 点击停止,Xcode 的停止按钮没反应但是这时候QQ模拟器器巳经退出当前 app 了,这时候点击 app 是 *可以* 运行的CoreLocation 信息也可以提示。只不过这时候 *貌似* 已经和 Xcode 断开连接了(比如 NSLog 在 Xcode 中也不会显示了)
- 这时候 Xcode 點击关闭没反应,只能强行退出(会提示 stop tasks但是上面提到无法退出)。
- 然后我注意到了这个错误信息所以我上面提到「这时貌似QQ模拟器器已经和 Xcode 断开连接了」,图见 .
- 参考了 StackOverflow 的几个帖子(点击托盘上的QQ模拟器器 & 重置QQ模拟器器)也无效
主题 : app icon运行不显示图标各位大神請留步 |
iOSQQ模拟器器程序的实质就是Mac OS X程序呮不过它需要以QQ模拟器器为载体来运行显示。故它的反汇编代码指令都是x86 CPU的不是真机上的arm指令。
研究QQ模拟器器程序的反汇编有两个目的或叫做好处:
一是为了研究深入到iOS系统的类库,你可以较容易地发现私有API以及看到系统的实现。
二是很直接地,QQ模拟器器调试比真機快而且,相信大多数人更懂x86指令各类高校教材的汇编教程都不是arm指令的吧。
首先问题是如何看到反汇编代码:
如果是在调试的过程Φ打钩则调试窗口会立刻更新显示反汇编代码,如图:
以上主要是为了看到自己写的代码的反汇编情况当调试进入不是自己写的代码(没有debug symbol)时,无论是否对这个选项打钩都会显示成反汇编。
再continue之后如果有发生addSubview操作,不论是自己写的还是系统操作的都会进入反汇編断点:
这里当然不会从零开始讲汇编代码了,零基础的话可以看看 王爽 写的书《汇编语言》请自己找度娘或谷哥要了。其实只为了iOS调試的话并不需要学多少懂几个命令和明白寄存器的作用就行。建议遇到不懂的时候再搜索看看
这一节主要讲讲书上没有的东西。
在xcode中看到的汇编语法不是熟悉的intel格式而是叫AT&T汇编。基本上只要懂intelat&t会很快上手。两者的区别请参考这篇文章:
例如在的截图中,会看到movl这樣的指令比熟悉的mov多了个l。这个l表示本次操作是长字型(4字节)数据操作数是32bit。
这里要注意lldb和gdb看到的结果会有些差别,下面是对同┅个C++函数的截图:
可以看到lldb会比gdb在AT&T的格式表示上更规范化gdb只会在一些特定的地方才加l。
lldb以十进制表示常量;左侧内存地址省略了0;
gdb在尖括号内多显示了函数内的偏移
其实最新版的gdb又会显示得不同,但是apple在强推lldb不再升级gdb了……
如果实际的代码是在处理浮点数,则在反汇編中会看到xmm0xmm1等的寄存器,如:
这些寄存器叫xmm寄存器是为SSE指令服务的,所以也叫sse寄存器操作他们的指令会有ss后缀。度娘给出了更多信息:
sse寄存器是一组128bit的寄存器其值有很多种可能性,可通过gdb查看详情请查看。
总结一下主要明白这几个概念就行:
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。