【发布时间】:2023-03-28 21:22:01
【问题描述】:
我正在编写的 Cocoa 应用程序有问题。它必须解析每小时更新的时间戳文件,并且在测试期间,由于分段错误,它在晚上 11:45 左右不断崩溃。我假设我必须向一个已被释放的对象发送消息。 Xcode 安装提供了哪些工具来跟踪对象分配并(希望)告诉我是否正在向已解除分配的对象发送消息?
我使用的是 Mac OS X 10.5。
【问题讨论】:
标签: objective-c cocoa segmentation-fault
我正在编写的 Cocoa 应用程序有问题。它必须解析每小时更新的时间戳文件,并且在测试期间,由于分段错误,它在晚上 11:45 左右不断崩溃。我假设我必须向一个已被释放的对象发送消息。 Xcode 安装提供了哪些工具来跟踪对象分配并(希望)告诉我是否正在向已解除分配的对象发送消息?
我使用的是 Mac OS X 10.5。
【问题讨论】:
标签: objective-c cocoa segmentation-fault
我会推荐以下内容:
NSZombieEnabled 监控消息何时发送到已释放的 NSObjects【讨论】:
我这样做的方法是使用名为gdb 的命令行工具。 Here 是一个关于如何使用它的教程。你必须学习它的一些命令,但是一旦你学会了它几乎是一种使用的乐趣。
注意:gbd 可用于 C、C++ 和 Objective-C 程序。
【讨论】:
你有在gdb下运行程序吗?这应该允许您在 SIGSEGV 时检查堆栈和变量。
要跟踪分配,请使用malloc_history。这需要设置MallocStackLogging 环境变量。
【讨论】:
快速要点:使用释放的内存位置通常会导致EXC_BAD_ACCESS 异常。如果这是您看到的崩溃原因,那么您认为这是一个释放问题是正确的。
【讨论】:
在 Xcode 的调试器(顶部带有 GUI 的 gdb)中运行它并重现崩溃。然后,查看堆栈跟踪。
消息释放对象通常在 objc_msgSend 中具有顶部帧。下一步是使用 NSZombieEnabled 运行应用程序并重现崩溃;僵尸会识别自己。
【讨论】:
objc_msgSend。