xcode反汇编调试iOS模拟器程序(七)Debug与Release的区别

首先自己写一段代码,加好断点,分别在Build Configuration为Debug和Release下运行,查看反汇编

[cpp]  view plain copy
  1. - (void)test  
  2. {  
  3.     UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10.0, 20.0f, 30.1, 40)];  
  4.     [button setTitle:@"test" forState:UIControlStateNormal];  
  5.     [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];  
  6.     [button addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];  
  7.     [self.view addSubview:button];  
  8.     [button release];  
  9. }  
debug下的反汇编结果:

[plain]  view plain copy
  1. 0x6a10:  pushl  %ebp  
  2. 0x6a11:  movl   %esp, %ebp  
  3. 0x6a13:  pushl  %ebx  
  4. 0x6a14:  pushl  %edi  
  5. 0x6a15:  pushl  %esi  
  6. 0x6a16:  subl   $108, %esp  
  7. 0x6a19:  calll  0x6a1e                    ; -[ViewController test] + 14 at ViewController.mm:375  
  8. 0x6a1e:  popl   %eax  
  9. 0x6a1f:  movl   12(%ebp), %ecx  
  10. 0x6a22:  movl   8(%ebp), %edx  
  11. 0x6a25:  leal   -40(%ebp), %esi  
  12. 0x6a28:  movl   $10, %edi  
  13. 0x6a2d:  cvtsi2ss%edi, %xmm0  
  14. 0x6a31:  movl   $20, %edi  
  15. 0x6a36:  cvtsi2ss%edi, %xmm1  
  16. 0x6a3a:  movss  44642(%eax), %xmm2  
  17. 0x6a42:  movl   $40, %edi  
  18. 0x6a47:  cvtsi2ss%edi, %xmm3  
  19. 0x6a4b:  movl   %edx, -16(%ebp)  
  20. 0x6a4e:  movl   %ecx, -20(%ebp)  
  21. 0x6a51:  movl   57106(%eax), %ecx  
  22. 0x6a57:  movl   56146(%eax), %edx  
  23. 0x6a5d:  movl   %ecx, (%esp)  
  24. 0x6a60:  movl   %edx, 4(%esp)  
  25. 0x6a64:  movl   %eax, -44(%ebp)  
  26. 0x6a67:  movss  %xmm2, -48(%ebp)  
  27. 0x6a6c:  movss  %xmm3, -52(%ebp)  
  28. 0x6a71:  movl   %esi, -56(%ebp)  
  29. 0x6a74:  movss  %xmm0, -60(%ebp)  
  30. 0x6a79:  movss  %xmm1, -64(%ebp)  
  31. 0x6a7e:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  32. 0x6a83:  movl   -56(%ebp), %ecx  
  33. 0x6a86:  movl   %ecx, (%esp)  
  34. 0x6a89:  movss  -60(%ebp), %xmm0  
  35. 0x6a8e:  movss  %xmm0, 4(%esp)  
  36. 0x6a94:  movss  -64(%ebp), %xmm1  
  37. 0x6a99:  movss  %xmm1, 8(%esp)  
  38. 0x6a9f:  movss  -48(%ebp), %xmm2  
  39. 0x6aa4:  movss  %xmm2, 12(%esp)  
  40. 0x6aaa:  movss  -52(%ebp), %xmm3  
  41. 0x6aaf:  movss  %xmm3, 16(%esp)  
  42. 0x6ab5:  movl   %eax, -68(%ebp)  
  43. 0x6ab8:  calll  0x6900                    ; CGRectMake(float, float, float, float) at CGGeometry.h:269  
  44. 0x6abd:  subl   $4, %esp  
  45. 0x6ac0:  movl   $64, %eax  
  46. 0x6ac5:  movl   $0, %ecx  
  47. 0x6aca:  movl   -44(%ebp), %edx  
  48. 0x6acd:  leal   58762(%edx), %esi  
  49. 0x6ad3:  leal   -40(%ebp), %edi  
  50. 0x6ad6:  movl   56158(%edx), %ebx  
  51. 0x6adc:  movl   -68(%ebp), %edx  
  52. 0x6adf:  movl   %edx, (%esp)  
  53. 0x6ae2:  movl   %ebx, 4(%esp)  
  54. 0x6ae6:  movl   (%edi), %edx  
  55. 0x6ae8:  movl   %edx, 8(%esp)  
  56. 0x6aec:  movl   4(%edi), %edx  
  57. 0x6aef:  movl   %edx, 12(%esp)  
  58. 0x6af3:  movl   8(%edi), %edx  
  59. 0x6af6:  movl   %edx, 16(%esp)  
  60. 0x6afa:  movl   12(%edi), %edx  
  61. 0x6afd:  movl   %edx, 20(%esp)  
  62. 0x6b01:  movl   %eax, -72(%ebp)  
  63. 0x6b04:  movl   %ecx, -76(%ebp)  
  64. 0x6b07:  movl   %esi, -80(%ebp)  
  65. 0x6b0a:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  66. 0x6b0f:  movl   %eax, -24(%ebp)  
  67. 0x6b12:  movl   -24(%ebp), %eax  
  68. 0x6b15:  movl   -44(%ebp), %ecx  
  69. 0x6b18:  movl   56374(%ecx), %edx  
  70. 0x6b1e:  movl   %eax, (%esp)  
  71. 0x6b21:  movl   %edx, 4(%esp)  
  72. 0x6b25:  movl   -80(%ebp), %eax  
  73. 0x6b28:  movl   %eax, 8(%esp)  
  74. 0x6b2c:  movl   $0, 12(%esp)  
  75. 0x6b34:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  76. 0x6b39:  movl   -24(%ebp), %eax  
  77. 0x6b3c:  movl   -44(%ebp), %ecx  
  78. 0x6b3f:  movl   57074(%ecx), %edx  
  79. 0x6b45:  movl   56274(%ecx), %esi  
  80. 0x6b4b:  movl   %edx, (%esp)  
  81. 0x6b4e:  movl   %esi, 4(%esp)  
  82. 0x6b52:  movl   %eax, -84(%ebp)  
  83. 0x6b55:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  84. 0x6b5a:  movl   -44(%ebp), %ecx  
  85. 0x6b5d:  movl   56386(%ecx), %edx  
  86. 0x6b63:  movl   -84(%ebp), %esi  
  87. 0x6b66:  movl   %esi, (%esp)  
  88. 0x6b69:  movl   %edx, 4(%esp)  
  89. 0x6b6d:  movl   %eax, 8(%esp)  
  90. 0x6b71:  movl   $0, 12(%esp)  
  91. 0x6b79:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  92. 0x6b7e:  movl   -24(%ebp), %eax  
  93. 0x6b81:  movl   -16(%ebp), %ecx  
  94. 0x6b84:  movl   -44(%ebp), %edx  
  95. 0x6b87:  movl   56454(%edx), %esi  
  96. 0x6b8d:  movl   56394(%edx), %edi  
  97. 0x6b93:  movl   %eax, (%esp)  
  98. 0x6b96:  movl   %edi, 4(%esp)  
  99. 0x6b9a:  movl   %ecx, 8(%esp)  
  100. 0x6b9e:  movl   %esi, 12(%esp)  
  101. 0x6ba2:  movl   $64, 16(%esp)  
  102. 0x6baa:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  103. 0x6baf:  movl   -16(%ebp), %eax  
  104. 0x6bb2:  movl   -44(%ebp), %ecx  
  105. 0x6bb5:  movl   56350(%ecx), %edx  
  106. 0x6bbb:  movl   %eax, (%esp)  
  107. 0x6bbe:  movl   %edx, 4(%esp)  
  108. 0x6bc2:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  109. 0x6bc7:  movl   -24(%ebp), %ecx  
  110. 0x6bca:  movl   -44(%ebp), %edx  
  111. 0x6bcd:  movl   56354(%edx), %esi  
  112. 0x6bd3:  movl   %eax, (%esp)  
  113. 0x6bd6:  movl   %esi, 4(%esp)  
  114. 0x6bda:  movl   %ecx, 8(%esp)  
  115. 0x6bde:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  116. 0x6be3:  movl   -24(%ebp), %eax  
  117. 0x6be6:  movl   -44(%ebp), %ecx  
  118. 0x6be9:  movl   56138(%ecx), %edx  
  119. 0x6bef:  movl   %eax, (%esp)  
  120. 0x6bf2:  movl   %edx, 4(%esp)  
  121. 0x6bf6:  calll  0xe56a                    ; symbol stub for: objc_msgSend  
  122. 0x6bfb:  addl   $108, %esp  
  123. 0x6bfe:  popl   %esi  
  124. 0x6bff:  popl   %edi  
  125. 0x6c00:  popl   %ebx  
  126. 0x6c01:  popl   %ebp  
  127. 0x6c02:  ret      
release下的反汇编结果:
[plain]  view plain copy
  1. 0x5310:  pushl  %ebp  
  2. 0x5311:  movl   %esp, %ebp  
  3. 0x5313:  pushl  %ebx  
  4. 0x5314:  pushl  %edi  
  5. 0x5315:  pushl  %esi  
  6. 0x5316:  subl   $44, %esp  
  7. 0x5319:  calll  0x531e                    ; -[ViewController test] + 14 at ViewController.mm:377  
  8. 0x531e:  popl   %edi  
  9. 0x531f:  movl   46610(%edi), %eax  
  10. 0x5325:  movl   45650(%edi), %ecx  
  11. 0x532b:  movl   %ecx, 4(%esp)  
  12. 0x532f:  movl   %eax, (%esp)  
  13. 0x5332:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  14. 0x5337:  movl   $1092616192, -32(%ebp)  
  15. 0x533e:  movl   $1101004800, -28(%ebp)  
  16. 0x5345:  movl   $1106300109, -24(%ebp)  
  17. 0x534c:  movl   $1109393408, -20(%ebp)  
  18. 0x5353:  movl   45662(%edi), %ecx  
  19. 0x5359:  movsd  -32(%ebp), %xmm0  
  20. 0x535e:  movsd  -24(%ebp), %xmm1  
  21. 0x5363:  movsd  %xmm1, 16(%esp)  
  22. 0x5369:  movsd  %xmm0, 8(%esp)  
  23. 0x536f:  movl   %ecx, 4(%esp)  
  24. 0x5373:  movl   %eax, (%esp)  
  25. 0x5376:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  26. 0x537b:  movl   %eax, %esi  
  27. 0x537d:  movl   45878(%edi), %eax  
  28. 0x5383:  leal   48262(%edi), %ecx  
  29. 0x5389:  movl   %ecx, 8(%esp)  
  30. 0x538d:  movl   %eax, 4(%esp)  
  31. 0x5391:  movl   %esi, (%esp)  
  32. 0x5394:  movl   $0, 12(%esp)  
  33. 0x539c:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  34. 0x53a1:  movl   46578(%edi), %eax  
  35. 0x53a7:  movl   45778(%edi), %ecx  
  36. 0x53ad:  movl   %ecx, 4(%esp)  
  37. 0x53b1:  movl   %eax, (%esp)  
  38. 0x53b4:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  39. 0x53b9:  movl   45890(%edi), %ecx  
  40. 0x53bf:  movl   %eax, 8(%esp)  
  41. 0x53c3:  movl   %ecx, 4(%esp)  
  42. 0x53c7:  movl   %esi, (%esp)  
  43. 0x53ca:  movl   $0, 12(%esp)  
  44. 0x53d2:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  45. 0x53d7:  movl   45898(%edi), %eax  
  46. 0x53dd:  movl   45958(%edi), %ecx  
  47. 0x53e3:  movl   %ecx, 12(%esp)  
  48. 0x53e7:  movl   8(%ebp), %ebx  
  49. 0x53ea:  movl   %ebx, 8(%esp)  
  50. 0x53ee:  movl   %eax, 4(%esp)  
  51. 0x53f2:  movl   %esi, (%esp)  
  52. 0x53f5:  movl   $64, 16(%esp)  
  53. 0x53fd:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  54. 0x5402:  movl   45854(%edi), %eax  
  55. 0x5408:  movl   %eax, 4(%esp)  
  56. 0x540c:  movl   %ebx, (%esp)  
  57. 0x540f:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  58. 0x5414:  movl   45858(%edi), %ecx  
  59. 0x541a:  movl   %esi, 8(%esp)  
  60. 0x541e:  movl   %ecx, 4(%esp)  
  61. 0x5422:  movl   %eax, (%esp)  
  62. 0x5425:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  63. 0x542a:  movl   45642(%edi), %eax  
  64. 0x5430:  movl   %eax, 4(%esp)  
  65. 0x5434:  movl   %esi, (%esp)  
  66. 0x5437:  calll  0xa78e                    ; symbol stub for: objc_msgSend  
  67. 0x543c:  addl   $44, %esp  
  68. 0x543f:  popl   %esi  
  69. 0x5440:  popl   %edi  
  70. 0x5441:  popl   %ebx  
  71. 0x5442:  popl   %ebp  
  72. 0x5443:  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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值