Xcode 如何使用otool检查是否启用堆栈粉碎?

Xcode 如何使用otool检查是否启用堆栈粉碎?,xcode,otool,Xcode,Otool,我看到了很多答案,比如,在互联网上说使用otool命令检查stack\u chk\u guard和stack\u chk\u fail 问题是,我不知道otool必须应用到哪个文件。在a上,他们说这个otool将应用于扩展名为.a的文件,这是一个库。但我不知道如何将其应用到我想检查整个项目,而不仅仅是一个图书馆的情况。我试图在我的项目中找到扩展名为.a的任何文件,但没有找到。我尝试对.app、.framework、.xccarchive和.ipa运行otool,均失败 有人能帮忙吗?如果有必要,

我看到了很多答案,比如,在互联网上说使用
otool
命令检查
stack\u chk\u guard
stack\u chk\u fail

问题是,我不知道otool必须应用到哪个文件。在a上,他们说这个
otool
将应用于扩展名为
.a
的文件,这是一个库。但我不知道如何将其应用到我想检查整个项目,而不仅仅是一个图书馆的情况。我试图在我的项目中找到扩展名为
.a
的任何文件,但没有找到。我尝试对
.app
.framework
.xccarchive
.ipa
运行
otool
,均失败


有人能帮忙吗?如果有必要,请详细说明,因为我以前从未使用过
otool
,而且互联网上的文档在描述什么样的文件可以通过
otool

在拉毛搜索会话后进行检查时根本没有帮助,我发现你应该提供给otool的文件在
.app
目录中。是的,
.app
是一个目录,而不是一个文件

这就是如何做到这一点:

  • 首先构建项目,这将创建一个
    .app
    文件
  • 在Xcode项目导航器(左侧面板)中,过滤底部的
    .app
    名称
  • 右键单击
    .app
    文件,选择“在finder中显示”
  • 打开终端窗口
  • 键入
    cd
    ,然后将
    .app
    目录拖到终端。它将填充路径
  • 键入
    otool-Iv您的应用程序\u二进制\u名称| grep堆栈
这个
你的\u应用程序\u二进制\u名称
位可能会让你感到困惑,但不要这样。只需注意你的
.app
目录的名称。例如,如果目录是
MyApp.app
,那么您的二进制文件应该是
MyApp
,不带扩展名,在
MyApp.app
目录中。如果您使用finder查看文件(右键单击
.app
并选择“显示软件包内容”),您将看到二进制文件的类型是UNIX可执行文件

(不要忘记,如果你的应用程序名包含空格,你需要使用反斜杠来转义空格。例如,如果你的应用程序名为“My Holy app”,则目录为
My\Holy\app.app
,应用程序二进制文件为
My\Holy\app

因此,对于名为“我的应用程序”的目标,您的终端将如下所示:

或者如果你的目标有类似“我的神圣应用”的空间:


编辑:用户助记符23表示,如果使用位码重建编译IPA,则otool的结果不会显示上述结果。您必须编译IPA,而不必从位代码重新生成。

这完全按照所述方式工作。谢谢你把这些放在一起。我发现它只适用于临时部署,而不适用于应用商店/发布模式。我说得对吗?结果显示,我出口了adhoc ipa。但不适用于为appstore导出的ipa。正常吗?@mnemonic23在我的例子中,我也是为企业发行而导出的,它为我显示了结果。我还没有尝试appstore案例。我已经确认导致结果不显示的位代码。所以我在导出时取消选中“包含位代码”,它就工作了。
$ cd ......./Build/Products/Debug-iphoneos/MyApp.app
$ otool -Iv MyApp | grep stack
0x00000001000c17bc 19966 ___stack_chk_fail
0x00000001000d8268 19967 ___stack_chk_guard
0x00000001000d8d18 19966 ___stack_chk_fail
$ cd ......./Build/Products/Debug-iphoneos/My\ Holy\ App.app
$ otool -Iv My\ Holy\ App | grep stack
0x00000001000c17bc 19966 ___stack_chk_fail
0x00000001000d8268 19967 ___stack_chk_guard
0x00000001000d8d18 19966 ___stack_chk_fail