【问题标题】:Xcode - scribble, guard edges and guard mallocXcode - 涂鸦、保护边缘和保护 malloc
【发布时间】:2012-03-24 07:46:33
【问题描述】:

有人能解释一下 Xcode 中这些选项的作用吗?

  • 启用涂鸦
  • 启用保护边缘
  • 启用 Guard Malloc

它们是什么,它们做什么以及它们对调试/测试有多大用处?

谢谢。

【问题讨论】:

    标签: iphone ios xcode macos


    【解决方案1】:

    来自documentation

    • 启用涂鸦。用 0xAA 填充分配的内存,用 0x55 填充释放的内存。
    • 启用保护边缘。在大分配之前和之后添加保护页。
    • 启用 Guard Malloc。使用 libgmalloc 捕获常见的内存问题,例如缓冲区溢出和 use-after-free。

    Scribble 会在内存块被释放后通过覆盖曾经在内存块中的任何数据来显示您正在使用该内存块。
    Guard edge 和 Guard Malloc 将通过读写保护内存块来帮助您发现内存溢出和(在某种程度上)use-after-free,以使您的程序在滥用内存时崩溃更加明显。

    【讨论】:

    • 我问这个是因为有时我在尝试调试的应用程序中发生崩溃,并且 Xcode 4 指向“ int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); ”作为错误的来源。所以我试图找到方法让它指向正确的错误行。
    • @DigitalRobot 即使他们没有提供 100% 的“保护”,如果这是一个内存错误,如果启用上述任何选项,您的程序更有可能在更接近实际位置时崩溃错误是。
    • 边问:0xAA和0x55的选择是完全随意的,还是有原因的?
    • @whoKnows 根据now archived doc,从乱涂内存中读取未初始化的指针将导致程序引用 0xAAAAAAAA 或 0x55555555 处的内存,这通常是未分配的,如果指针是为阅读或写作而取消引用。
    • 我知道这是几年前问的,但我对这些奇怪的值有其他解释。 AA 是 10101010 二进制,55 是它的负值,01010101。如果另一个值在内存中,写入其中一个值可确保所有 8 位都被重写。此外,将 AA 更改为 55,反之亦然,只需与 FF 进行异或运算即可,速度非常快。如果值为 55,则与 55 进行与运算将给您 55,如果它是 AA,则为 0,反之亦然。使用这些值可以快速轻松地完成很多事情。我想这就是为什么它们是测试内存读/写的常用值的原因。
    【解决方案2】:

    上面的“文档”链接通常指向 Xcode,但更具体地说,RN-MallocOptions 详细介绍了这些(和其他)选项。

    Jim Kubicek 在Debugging Smashed Memory in Obj-C 中展示了一个很好的示例,包括重要的“如何在 Xcode 中启用这些功能?”问题:

    打开“编辑方案”窗口并导航到“诊断”选项卡。您需要打开“启用 Scribble”和“Malloc Stack”。 ...简而言之,“启用涂鸦”将导致分配器将 0xAA 写入新分配的内存并将 0x55 写入释放的内存。 “Malloc Stack”会记录你的内存分配和释放历史。

    如果您已经阅读到这里,您可能会对 Apple 的技术说明感兴趣:

    【讨论】:

    • 那篇关于在 Obj-C 中调试 Smashed Memory 的文章非常棒。
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多