XCode:差异组装之前和之后更改源代码后

时间:2011-05-08 12:08:11

标签: xcode assembly build diff compare

我希望能够对Xcode项目进行更改(更改源代码,在文件系统上移动文件,添加依赖项或库等),然后构建它并将构建产品与构建产品进行比较在进行更改之前确认它们是相同的。我该怎么做?

区分构建产品不起作用;它们每次都不同

我尝试在不同的时间以相同的方式构建两种不同的产品,并且它们不同。咦?嗯..构建时间必须影响构建产品。这是我做的:

在Xcode中,构建产品(Command + B)后,按Command + 7以显示日志导航器。然后,点击导航器中的“Build $ {PRODUCT_NAME}”。然后,在编辑器的底部,通过单击右侧的气泡展开“触摸...”脚本。复制脚本中的最后一个目录路径。它应该类似于:/Users/${USER}/Library/Developer/Xcode/DerivedData/${PRODUCT_NAME}-abomilaxrsffqkeasoiwbfisjghq/Build/Products/Debug-iphonesimulator/${PRODUCT_NAME}.app这是构建产品的路径。然后,打开终端,并执行以下操作:

# Change to the build product's directory.
cd /Users/${USER}/Library/Developer/Xcode/DerivedData/${PRODUCT_NAME}-abomilaxrsffqkeasoiwbfisjghq/Build/Products/Debug-iphonesimulator/

# Copy the build product to another directory, like your Desktop.
open .                               # if you prefer Finder
cp -R ${PRODUCT_NAME}.app ~/Desktop/ # or use Terminal

# Confirm the bundles are identical.
diff -r ${PRODUCT_NAME}.app ~/Desktop/${PRODUCT_NAME}.app

现在,在Xcode中执行Command + Shift + K清理。然后,再次构建并运行上面相同的差异。他们是不同的!

如何获取Xcode生成的程序集?

那么,有没有办法区分程序集,看它们是否不同?我在这里的一个问题的答案中看到了这样做的方法,但我忘记了它的位置,我找不到它。

如果组件相同,那是否意味着构建产品也是一样的?我不这么认为,因为我认为某些构建设置会影响程序集编译成机器代码的方式。如果是这样,哪些构建设置确实会影响程序集编译为机器代码的方式。这样,我可以确认那些之前是相同的&之后并确信产品是相同的(除了它们的构建时间戳)。

1 个答案:

答案 0 :(得分:1)

使用diff不是直接比较二进制文件的好工具。

整个二进制文件的汇编

在您的Product.app中应该是一个可能只是命名为“Product”的文件。那是真正的可执行文件。您可以通过右键单击Product.app组中的Products文件并选择“在Finder中显示”来找到它。示例位置为:~/Library/Developer/Xcode/DerivedData/Product-dqcwcdqvrxhcfzdkoovramlggzzg/Build/Products/Debug-iphoneos/Product.app/Product

  $ file Product.app/Product
  Mach-O executable arm

现在你要拆卸它。您可以使用Mach-O对象工具otool

执行此操作
 $ xcrun -sdk iphoneos otool -tv Product.app/Product

这应该转储整个二进制文件的反汇编。将其保存到文件中,您可以将其与其他重新编译区分开来。这是整个二进制文件。

单个文件的汇编

如果您只关心几个文件,它们应该位于~/Library/Developer/Xcode/DerivedData/Product-hdomilaxrhfpqkeanoiwbrirngqq/Build/Intermediates/Product.build/Debug-iphoneos/Product.build/Objects-normal/armv6中的armv7位置。应该有C和Obj-C文件的.o文件版本,您可以使用与上面相同的命令单独反汇编这些文件。 E.g:

 $ xcrun -sdk iphoneos otool -tv AppDelegate.o

据我所知,Xcode并没有留下中间的汇编文件,尽管可能会有某个标志强制它生成它们。