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

问题描述 投票:0回答:3

大多数时候,当Iphone程序崩溃时,编译器会显示堆栈中充满了“否”,但这些“否”对我来说没有任何意义。它很少指出问题可能出在哪里,而且大多数都是这些无用的“不”。如何确保当您的程序在开发/测试过程中崩溃时,它会显示导致崩溃的位置?

iphone crash
3个回答
3
投票

我的 iPhone 开发生活很糟糕,直到我发现 NSZombieEnabled。 通过将此标志添加到可执行文件中,它将让您知道有问题的对象的名称是什么,从而帮助您查看任何内存问题。

这是通过从不真正释放一个对象,而是通过将其包装为“僵尸”并在其中设置一个标志来表示它通常会被释放来实现的。 这样,如果您尝试再次访问它,它仍然知道您犯错误之前是什么,并且有了这一点信息,您通常可以回溯以查看问题所在。

当调试器有时无法获取任何有用信息时,它在后台线程中特别有帮助。

非常重要的是要注意,但是,您需要 100% 确保这仅在您的调试代码中,而不是您的分发代码中。 因为没有任何东西被发布,所以你的应用程序将会泄漏、泄漏、泄漏。 为了提醒我这样做,我将此日志放入我的应用程序委托中:

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

1
投票

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

我的 .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]”以使符号正确显示在堆栈跟踪中。

请注意,它必须与生成崩溃的可执行文件和 Dym 文件相同! 每次重新编译时,内容的位置都会改变。


0
投票

要做的事情:

1)断点调试

2)添加全局断点:objc_exception_throw

然后查看调试器窗口

© www.soinside.com 2019 - 2024. All rights reserved.