【问题标题】:How can I track down a segmentation fault in a Cocoa application?如何跟踪 Cocoa 应用程序中的分段错误?
【发布时间】:2023-03-28 21:22:01
【问题描述】:

我正在编写的 Cocoa 应用程序有问题。它必须解析每小时更新的时间戳文件,并且在测试期间,由于分段错误,它在晚上 11:45 左右不断崩溃。我假设我必须向一个已被释放的对象发送消息。 Xcode 安装提供了哪些工具来跟踪对象分配并(希望)告诉我是否正在向已解除分配的对象发送消息?

我使用的是 Mac OS X 10.5。

【问题讨论】:

    标签: objective-c cocoa segmentation-fault


    【解决方案1】:

    我会推荐以下内容:

    【讨论】:

    • 不要一起做这些事情。 NSZombieEnabled 将导致“泄漏”出现在 Instruments 中。
    • +1:NSZombie 对象是 Apple 规定的处理此类事情的方法。就像纳尔说的那样,不要使用启用了僵尸的仪器。
    【解决方案2】:

    我这样做的方法是使用名为gdb 的命令行工具。 Here 是一个关于如何使用它的教程。你必须学习它的一些命令,但是一旦你学会了它几乎是一种使用的乐趣。

    注意:gbd 可用于 C、C++ 和 Objective-C 程序。

    【讨论】:

      【解决方案3】:

      你有在gdb下运行程序吗?这应该允许您在 SIGSEGV 时检查堆栈和变量。

      要跟踪分配,请使用malloc_history。这需要设置MallocStackLogging 环境变量。

      【讨论】:

        【解决方案4】:

        快速要点:使用释放的内存位置通常会导致EXC_BAD_ACCESS 异常。如果这是您看到的崩溃原因,那么您认为这是一个释放问题是正确的。

        【讨论】:

          【解决方案5】:

          在 Xcode 的调试器(顶部带有 GUI 的 gdb)中运行它并重现崩溃。然后,查看堆栈跟踪。

          消息释放对象通常在 objc_msgSend 中具有顶部帧。下一步是使用 NSZombieEnabled 运行应用程序并重现崩溃;僵尸会识别自己。

          【讨论】:

          • 崩溃有点难以重现,但我从崩溃日志中知道故障发生在objc_msgSend
          • 那么下一步就是使用 NSZombieEnabled 运行它。
          猜你喜欢
          • 1970-01-01
          • 2011-02-09
          • 2015-12-03
          • 2012-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-12
          相关资源
          最近更新 更多