【问题标题】:Bug in XCode debugger?XCode 调试器中的错误?
【发布时间】:2010-11-20 02:51:59
【问题描述】:

我正在开发一个 iPhone 应用程序,该应用程序使用我拥有源代码的外部库。在调试期间,一些对象在调试器中列为 0x0,但应用程序运行良好。此外,一些对象地址指向错误的东西。 这些符号在外部库中。如果我在外部库中跟踪文件,地址就可以了。

有没有人建议如何阻止这种行为?

【问题讨论】:

  • 我相信内存地址为 0x0 的对象是 nil - 这不是错误。
  • 我知道它是零。该程序应该立即崩溃,因为我正在阅读这些对象。这就是令我惊奇的地方。这不是因为我不知道 0x0 是什么。我知道它是什么,这就是它令人惊叹的原因。
  • 在 ObjC 中取消引用 nil 是合法的。它不应该崩溃。它会默默地什么都不做。
  • Rob,正如我所说,问题不在于程序。它与 XCode 调试器一起使用。程序运行得和我预期的一样好。我的对象正在被正确访问,但调试器坚持认为什么都没有。
  • 我认为这需要访问 bugreporter.apple.com。在使用 Xcode 4.2.1 在 MacOS 10.7 sdk 下构建时,我看到了类似的行为,我希望我可以对试图用错误的程序员错误场景解释 IDE 错误的 cmets 打分。

标签: iphone cocoa-touch xcode ios-simulator


【解决方案1】:

您曾经解决过这个问题吗?在混合 Thumb 和 ARM 模式时,我也注意到 gdb 中的奇怪行为。例如,gdb 报告的变量地址似乎与使用 printf("%p\n") 语句报告的地址相差 64 个字节。或许需要明确告知 gdb 当前运行模式是 ARM 还是 Thumb...?

【讨论】:

    【解决方案2】:

    更新:目标设置 > 构建选项卡 > GCC 4.2 代码生成 > “Compile for Thumb”

    我关闭了这个目标设置,gdb 问题就消失了。

    --

    嗨,约翰。

    我明白你的意思。我还看到了一个问题,即 gdb 和 NSLog() 在我的代码的某些部分给我不同的指针结果。

    在一个简化的示例中,当我在此函数的任何行上设置断点时,gdb 无法报告“指针”的正确值:

    id testPointer( id pointer )
    {
        NSLog( @"pointer value: %p", pointer );
    
        @try
        {
            NSLog( @"foo" );
        }
        @catch ( NSException *e )
        { }
        @finally
        { }
    
        return pointer;
    }
    

    【讨论】:

    • 在 MacOS 10.7 SDK 下构建时,我在 Xcode 4.2.1 下遇到了同样的问题。我可以关闭编译以获得成功!无论如何,我在为 iOS 编译时都会这样做。
    【解决方案3】:

    正如 zPesk 所说,0x0 是 nil,这是尚未初始化的对象(尤其是实例变量)的常用值。我不确定你所说的“指向错误的东西”是什么意思。如果您尚未初始化本地(堆栈)变量,它可能会指向任何随机地址,直到它被初始化。你有什么行为问题?

    【讨论】:

    • 它指向错误的东西,因为我在调试器中看到的指针指向我知道的其他东西,但这些指针永远不应该指向那里。我已经在这个程序上工作了一段时间,这是第一次发生。我尝试检查调试器延迟符号加载无济于事。
    • 您在 gdb 中发现错误的可能性极小。也许代码的更多细节和 gdb 返回的内容在这里会有很大帮助。你没有打开编译器优化是吗?这总是会导致令人惊讶的调试器结果。
    • 另外,如果您怀疑 gdb 告诉您的内容,您应该始终添加 NSLog() 语句并比较结果。
    • gdb 中的错误:不太可能。 xcode 中的错误:可能。 xcode 的蹩脚设计让调试器在你不知不觉中对你撒谎:绝对。我称之为错误,尽管有些人不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多