Xcode - 涂鸦、保护边缘和保护 malloc

Xcode - scribble, guard edges and guard malloc

提问人:Duck 提问时间:3/7/2012 更新时间:4/20/2020 访问量:19685

问:

有人可以解释一下 Xcode 中的这些选项有什么作用吗?

  • 启用随手写
  • 启用防护边缘
  • 启用 Guard Malloc

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

谢谢。

iPhone iOS Xcode macOS

评论


答:

57赞 Joachim Isaksson 3/7/2012 #1

文档

  • 启用随手写。用 0xAA 填充分配的内存,用 0x55 释放内存。
  • 启用防护边缘。在大量分配之前和之后添加保护页。
  • 启用 Guard Malloc。使用 libgmalloc 来捕获常见的内存问题,例如缓冲区溢出和释放后使用。

Scribble 通过覆盖释放内存块中曾经存在的任何数据,使您在释放内存块后使用内存块变得非常明显。
保护边缘和 Guard Malloc 将帮助您发现内存溢出和(在某种程度上)通过读取和写入保护内存块来释放后使用,以便在滥用内存时使程序更明显地崩溃。

评论

0赞 Duck 3/7/2012
我问这个问题是因为有时我在尝试调试的应用程序中遇到崩溃,而 Xcode 4 指向“ int retVal = UIApplicationMain(argc, argv, nil, @”AppDelegate“);“作为错误的根源。所以我试图找到方法让它指向正确的错误线。
0赞 Joachim Isaksson 3/7/2012
@DigitalRobot 即使它们不提供 100% 的“保护”,如果是内存错误,如果启用上述任何选项,您的程序更有可能在更接近实际错误的位置崩溃。
3赞 whoKnows 6/15/2015
附带问题:0xAA和0x55的选择是完全任意的,还是有原因的?
0赞 ettore 6/26/2018
@whoKnows 根据这个现已存档的文档,从潦草的内存中读取未初始化的指针将导致程序引用0xAAAAAAAA或0x55555555处的内存,这些内存通常是未分配的,如果指针被取消引用以进行读取或写入,将导致立即崩溃。
6赞 Francis Pierot 9/5/2018
我知道这是几年前被问到的,但我对这些奇怪的价值观有其他解释。AA 是二进制10101010,55 是它的负值,01010101。写入其中一个值可确保在内存中的另一个值中重写所有 8 位。此外,将 AA 更改为 55,反之亦然,只需使用 FF 进行 xoring 即可完成,这非常快。如果值为 55,则 55 的 AND 将为您提供 55,如果值为 AA,则为 0,反之亦然。使用这些值可以快速轻松地做很多事情。我想这就是为什么它们是测试内存读/写的共同值。
6赞 Nuthatch 4/26/2013 #2

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

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

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

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

评论

0赞 rustyMagnet 8/22/2018
那篇关于在 Obj-C 中调试 Smashed Memory 的文章真是太棒了。