xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
来源:互联网 发布:js中的window.onload 编辑:程序博客网 时间:2024/04/30 07:09
首先自己写一段代码,加好断点,分别在Build Configuration为Debug和Release下运行,查看反汇编
- (void)test{ UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10.0, 20.0f, 30.1, 40)]; [button setTitle:@"test" forState:UIControlStateNormal]; [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; [button release];}debug下的反汇编结果:
0x6a10: pushl %ebp0x6a11: movl %esp, %ebp0x6a13: pushl %ebx0x6a14: pushl %edi0x6a15: pushl %esi0x6a16: subl $108, %esp0x6a19: calll 0x6a1e ; -[ViewController test] + 14 at ViewController.mm:3750x6a1e: popl %eax0x6a1f: movl 12(%ebp), %ecx0x6a22: movl 8(%ebp), %edx0x6a25: leal -40(%ebp), %esi0x6a28: movl $10, %edi0x6a2d: cvtsi2ss%edi, %xmm00x6a31: movl $20, %edi0x6a36: cvtsi2ss%edi, %xmm10x6a3a: movss 44642(%eax), %xmm20x6a42: movl $40, %edi0x6a47: cvtsi2ss%edi, %xmm30x6a4b: movl %edx, -16(%ebp)0x6a4e: movl %ecx, -20(%ebp)0x6a51: movl 57106(%eax), %ecx0x6a57: movl 56146(%eax), %edx0x6a5d: movl %ecx, (%esp)0x6a60: movl %edx, 4(%esp)0x6a64: movl %eax, -44(%ebp)0x6a67: movss %xmm2, -48(%ebp)0x6a6c: movss %xmm3, -52(%ebp)0x6a71: movl %esi, -56(%ebp)0x6a74: movss %xmm0, -60(%ebp)0x6a79: movss %xmm1, -64(%ebp)0x6a7e: calll 0xe56a ; symbol stub for: objc_msgSend0x6a83: movl -56(%ebp), %ecx0x6a86: movl %ecx, (%esp)0x6a89: movss -60(%ebp), %xmm00x6a8e: movss %xmm0, 4(%esp)0x6a94: movss -64(%ebp), %xmm10x6a99: movss %xmm1, 8(%esp)0x6a9f: movss -48(%ebp), %xmm20x6aa4: movss %xmm2, 12(%esp)0x6aaa: movss -52(%ebp), %xmm30x6aaf: movss %xmm3, 16(%esp)0x6ab5: movl %eax, -68(%ebp)0x6ab8: calll 0x6900 ; CGRectMake(float, float, float, float) at CGGeometry.h:2690x6abd: subl $4, %esp0x6ac0: movl $64, %eax0x6ac5: movl $0, %ecx0x6aca: movl -44(%ebp), %edx0x6acd: leal 58762(%edx), %esi0x6ad3: leal -40(%ebp), %edi0x6ad6: movl 56158(%edx), %ebx0x6adc: movl -68(%ebp), %edx0x6adf: movl %edx, (%esp)0x6ae2: movl %ebx, 4(%esp)0x6ae6: movl (%edi), %edx0x6ae8: movl %edx, 8(%esp)0x6aec: movl 4(%edi), %edx0x6aef: movl %edx, 12(%esp)0x6af3: movl 8(%edi), %edx0x6af6: movl %edx, 16(%esp)0x6afa: movl 12(%edi), %edx0x6afd: movl %edx, 20(%esp)0x6b01: movl %eax, -72(%ebp)0x6b04: movl %ecx, -76(%ebp)0x6b07: movl %esi, -80(%ebp)0x6b0a: calll 0xe56a ; symbol stub for: objc_msgSend0x6b0f: movl %eax, -24(%ebp)0x6b12: movl -24(%ebp), %eax0x6b15: movl -44(%ebp), %ecx0x6b18: movl 56374(%ecx), %edx0x6b1e: movl %eax, (%esp)0x6b21: movl %edx, 4(%esp)0x6b25: movl -80(%ebp), %eax0x6b28: movl %eax, 8(%esp)0x6b2c: movl $0, 12(%esp)0x6b34: calll 0xe56a ; symbol stub for: objc_msgSend0x6b39: movl -24(%ebp), %eax0x6b3c: movl -44(%ebp), %ecx0x6b3f: movl 57074(%ecx), %edx0x6b45: movl 56274(%ecx), %esi0x6b4b: movl %edx, (%esp)0x6b4e: movl %esi, 4(%esp)0x6b52: movl %eax, -84(%ebp)0x6b55: calll 0xe56a ; symbol stub for: objc_msgSend0x6b5a: movl -44(%ebp), %ecx0x6b5d: movl 56386(%ecx), %edx0x6b63: movl -84(%ebp), %esi0x6b66: movl %esi, (%esp)0x6b69: movl %edx, 4(%esp)0x6b6d: movl %eax, 8(%esp)0x6b71: movl $0, 12(%esp)0x6b79: calll 0xe56a ; symbol stub for: objc_msgSend0x6b7e: movl -24(%ebp), %eax0x6b81: movl -16(%ebp), %ecx0x6b84: movl -44(%ebp), %edx0x6b87: movl 56454(%edx), %esi0x6b8d: movl 56394(%edx), %edi0x6b93: movl %eax, (%esp)0x6b96: movl %edi, 4(%esp)0x6b9a: movl %ecx, 8(%esp)0x6b9e: movl %esi, 12(%esp)0x6ba2: movl $64, 16(%esp)0x6baa: calll 0xe56a ; symbol stub for: objc_msgSend0x6baf: movl -16(%ebp), %eax0x6bb2: movl -44(%ebp), %ecx0x6bb5: movl 56350(%ecx), %edx0x6bbb: movl %eax, (%esp)0x6bbe: movl %edx, 4(%esp)0x6bc2: calll 0xe56a ; symbol stub for: objc_msgSend0x6bc7: movl -24(%ebp), %ecx0x6bca: movl -44(%ebp), %edx0x6bcd: movl 56354(%edx), %esi0x6bd3: movl %eax, (%esp)0x6bd6: movl %esi, 4(%esp)0x6bda: movl %ecx, 8(%esp)0x6bde: calll 0xe56a ; symbol stub for: objc_msgSend0x6be3: movl -24(%ebp), %eax0x6be6: movl -44(%ebp), %ecx0x6be9: movl 56138(%ecx), %edx0x6bef: movl %eax, (%esp)0x6bf2: movl %edx, 4(%esp)0x6bf6: calll 0xe56a ; symbol stub for: objc_msgSend0x6bfb: addl $108, %esp0x6bfe: popl %esi0x6bff: popl %edi0x6c00: popl %ebx0x6c01: popl %ebp0x6c02: retrelease下的反汇编结果:
0x5310: pushl %ebp0x5311: movl %esp, %ebp0x5313: pushl %ebx0x5314: pushl %edi0x5315: pushl %esi0x5316: subl $44, %esp0x5319: calll 0x531e ; -[ViewController test] + 14 at ViewController.mm:3770x531e: popl %edi0x531f: movl 46610(%edi), %eax0x5325: movl 45650(%edi), %ecx0x532b: movl %ecx, 4(%esp)0x532f: movl %eax, (%esp)0x5332: calll 0xa78e ; symbol stub for: objc_msgSend0x5337: movl $1092616192, -32(%ebp)0x533e: movl $1101004800, -28(%ebp)0x5345: movl $1106300109, -24(%ebp)0x534c: movl $1109393408, -20(%ebp)0x5353: movl 45662(%edi), %ecx0x5359: movsd -32(%ebp), %xmm00x535e: movsd -24(%ebp), %xmm10x5363: movsd %xmm1, 16(%esp)0x5369: movsd %xmm0, 8(%esp)0x536f: movl %ecx, 4(%esp)0x5373: movl %eax, (%esp)0x5376: calll 0xa78e ; symbol stub for: objc_msgSend0x537b: movl %eax, %esi0x537d: movl 45878(%edi), %eax0x5383: leal 48262(%edi), %ecx0x5389: movl %ecx, 8(%esp)0x538d: movl %eax, 4(%esp)0x5391: movl %esi, (%esp)0x5394: movl $0, 12(%esp)0x539c: calll 0xa78e ; symbol stub for: objc_msgSend0x53a1: movl 46578(%edi), %eax0x53a7: movl 45778(%edi), %ecx0x53ad: movl %ecx, 4(%esp)0x53b1: movl %eax, (%esp)0x53b4: calll 0xa78e ; symbol stub for: objc_msgSend0x53b9: movl 45890(%edi), %ecx0x53bf: movl %eax, 8(%esp)0x53c3: movl %ecx, 4(%esp)0x53c7: movl %esi, (%esp)0x53ca: movl $0, 12(%esp)0x53d2: calll 0xa78e ; symbol stub for: objc_msgSend0x53d7: movl 45898(%edi), %eax0x53dd: movl 45958(%edi), %ecx0x53e3: movl %ecx, 12(%esp)0x53e7: movl 8(%ebp), %ebx0x53ea: movl %ebx, 8(%esp)0x53ee: movl %eax, 4(%esp)0x53f2: movl %esi, (%esp)0x53f5: movl $64, 16(%esp)0x53fd: calll 0xa78e ; symbol stub for: objc_msgSend0x5402: movl 45854(%edi), %eax0x5408: movl %eax, 4(%esp)0x540c: movl %ebx, (%esp)0x540f: calll 0xa78e ; symbol stub for: objc_msgSend0x5414: movl 45858(%edi), %ecx0x541a: movl %esi, 8(%esp)0x541e: movl %ecx, 4(%esp)0x5422: movl %eax, (%esp)0x5425: calll 0xa78e ; symbol stub for: objc_msgSend0x542a: movl 45642(%edi), %eax0x5430: movl %eax, 4(%esp)0x5434: movl %esi, (%esp)0x5437: calll 0xa78e ; symbol stub for: objc_msgSend0x543c: addl $44, %esp0x543f: popl %esi0x5440: popl %edi0x5441: popl %ebx0x5442: popl %ebp0x5443: ret单从行数上看,debug是127行,release是72行,差距很大。这当然是编译器优化的结果,特别对于一些分支多的、带循环的源码时,反汇编和源码的实际动作执行顺序都可能不同。
可以看到:
debug版在0x6ab8调用CGRectMake之前做了好多多余动作,往返访问xmm寄存器。debug版的浮点数,像30.1这样的数值才被真正当做浮点,10.0和20.0f都被当整数了。而release版都是立即数。反汇编中会把float所占的4字节空间的值显示为十进制数,需要自行转换实际的值,转换方法参见http://blog.csdn.net/hursing/article/details/8688862。
CGRectMake的实质是个inline函数,在debug版还存在单独的函数代码入口位置,但release版就没有了。
函数的开头表示debug版要用108字节作为局部变量空间,而release版只需要44字节。
这样的区别还有很多,可通过反汇编自己的代码来观察到。当调试进入系统的代码时,可以看出都是release版的,即debug版链接的仍是release版的静态库。
转载请注明出处:http://blog.csdn.net/hursing
- xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
- xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
- xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
- xcode反汇编调试iOS模拟器程序
- Xcode反汇编调试iOS模拟器程序
- xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
- xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
- xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
- xcode反汇编调试iOS模拟器程序(六)函数出入口处的处理与局部变量
- xcode反汇编调试iOS模拟器程序(六)函数出入口处的处理与局部变量
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(二)看懂反汇编
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(二)看懂反汇编
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(一)查看反汇编
- xcode反汇编调试iOS模拟器程序(二)看懂反汇编
- Linux redhat中文字体安装
- HT68F30控制5150 IIC控制总线
- Android 自定义 View 中 onKeyDown监听 没反应
- Android AsyncTask异步处理
- memcached 压力测试以及性能分析
- xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别
- 如何为iOS设备开发通用的应用程序
- QT绘制半透明窗体
- 将文件上传到网络共享服务器的方法
- jquery mobile 的4个初始化事件
- 用定时器进行miller2编码的思考
- 函数调用具体过程-堆栈【1】
- 苹果UDID(uniqueIdentifier)的替代方案
- list_for_each_entry list_for_each_entry_safe