代码之家  ›  专栏  ›  技术社区  ›  itsaboutcode

编译器显示的iphone程序崩溃和堆栈报告是完全无用的!

  •  2
  • itsaboutcode  · 技术社区  · 15 年前

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   coneybeare    15 年前

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

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

    它在后台线程中尤其有用,因为调试器有时会把有用的信息放在外。

    需要注意的是 但是,您需要100%确保这只存在于调试代码中,而不存在于分发代码中。因为没有任何东西可以发布,你的应用程序会泄漏,泄漏和泄漏。为了提醒我执行此操作,我将此日志放在AppDelegate中:

    if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
      NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
    
        2
  •  1
  •   Kendall Helmstetter Gelner    15 年前

    你要找的关键词是“象征性”。如果您有一个来自设备的崩溃日志,您必须对其进行太阳符号化,以便让堆栈跟踪给您提供行号。

    帮助我运行命令的.profile中的函数是:

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

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

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

        3
  •  0
  •   zaph    15 年前

    要做的事情:

    1)在断点打开的情况下进行调试

    2)添加全局断点:objc_exception_throw

    然后在调试器窗口中查找