编译器显示的IPhone程序崩溃和堆栈报告完全没用!

时间:2009-09-18 13:44:46

标签: iphone compiler-construction crash

大多数时候,当Iphone程序崩溃时,编译器显示堆栈中充满了no,但这些没有对我没有任何意义。它很少指出问题可能出在哪里,而且大多数情况下都存在无用的问题。如何确保在程序崩溃时进行开发/测试时,它会显示导致此崩溃的位置?

3 个答案:

答案 0 :(得分:3)

在我发现NSZombieEnabled之前,我的iPhone开发生活很糟糕。通过将此标志添加到您的可执行文件中,它将通过让您知道出现故障的对象的名称来帮助您查看任何内存问题。

这可以通过永远不会实际释放一个对象,但将其包装为“僵尸”并在其中设置一个标志,表示它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在发生错误之前它是什么,并且通过这些信息,您通常可以回溯以查看问题所在。

当调试器有时会破坏任何有用信息时,它特别有助于后台线程。

非常重要注意但是,您需要100%确保这只是在您的调试代码而不是您的分发代码中。因为什么都没有发布,你的应用程序将泄漏,泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

答案 1 :(得分:1)

您正在寻找的关键词是“象征性的”。如果您有来自设备的崩溃日志,则必须在其上进行sun符号化,以便让堆栈跟踪为您提供行号。

我在.profile中帮助我运行命令的功能是:

function desym
{
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}

基本上,您将应用程序包,构建时生成的dsym文件和崩溃日志放在同一目录中,然后运行“dysm [CrashLog File Name]”以使符号在堆栈跟踪中正确显示。

请注意,必须是生成崩溃的同一个可执行文件和dysm文件!每次重新编译时,事物的位置都会发生变化。

答案 2 :(得分:0)

要做的事情:

1)使用断点进行调试

2)添加一个全局断点:objc_exception_throw

然后查看调试器窗口