【问题标题】:Xcode evaluating expressions while debuggingXcode 在调试时评估表达式
【发布时间】:2011-06-17 01:33:06
【问题描述】:

我正在开发一个 iPhone 应用程序。我是一名全职 Java 开发人员,我习惯于使用 Eclipse,我可以在其中设置断点并停止进程。然后,我可以输入任何我想要的表达式,Eclipse 将使用流程中该点的值对其进行评估。

有没有办法在 Xcode 中做到这一点?我希望能够在断点处停止,然后输入一些代码来评估它。 gdb 控制台会让我做po (print-object),但它确实是有限的。有什么帮助吗?

【问题讨论】:

  • 什么是“po”? gdb 控制台可让您评估大量任意函数。你特别想做什么?
  • "po" 是打印对象。 Apple 对 gcc 的扩展导致 description 消息被发送到 ObjC 实例,以便它返回它的描述。
  • 啊,所以没听说过。有趣。
  • 目前的“公认答案”没有回答如何使用表达式的问题。另一个答案是:stackoverflow.com/a/15689701/466771
  • 我认为您要查找的命令是expr。当调试器启动时,您可以从(lldb) 命令提示符使用它。您可以通过expr local_int = 5 修改当前执行上下文。

标签: objective-c xcode debugging gdb


【解决方案1】:

在 XCode 4.0 中,这有点隐藏在 GUI 中。当您处于断点时,您可能会在调试区域内看到变量视图;它是显示局部变量等的窗格。右键单击变量视图并选择“添加表达式...”

我意识到这是一个旧线程,但它仍然是谷歌的热门话题,所以我认为值得回答。

【讨论】:

  • 我觉得开发 xcode 的人从来没有专业地开发过应用程序。
  • “与众不同”
【解决方案2】:

我的做法:

po [NSUserDefaults standardUserDefaults]

显示:

po [[NSUserDefaults standardUserDefaults] stringForKey:@"Currency"]

显示:“瑞士法郎”

【讨论】:

  • 这是唯一真正回答问题的答案。 Peter 建议您在调试器断点暂停执行时在调试控制台中可用的(lldb) 提示符处使用po 命令。原发帖者指出他们已经使用po,但至少这是回答问题的尝试。
  • 至少这是一个答案
【解决方案3】:

在调试器中使用“表达式”命令。使用它相对简单。只需键入命令表达式并按回车键。然后将提示您输入表达式。这是一个例子

(lldb) expression
Enter expressions, then terminate with an empty line to evaluate:
2+2

(int) $2 = 4

我还附上了下面表达式命令的帮助信息。希望这会有所帮助。

在当前程序上下文中计算一个 C/ObjC/C++ 表达式,使用用户 定义的变量和当前范围内的变量。这个命令需要 “原始”输入(无需引用内容)。

语法:表达式——

命令选项用法: 表达式 [-f ] [-G ] [-a ] [-d ] [-t ] [-u ] -- 表达式 [-o] [-a ] [-d ] [-t ] [-u ] -- 表达

   -G <gdb-format> ( --gdb-format <gdb-format> )
        Specify a format using a GDB format specifier string.

   -a <boolean> ( --all-threads <boolean> )
        Should we run all threads if the execution doesn't complete on one
        thread.

   -d <boolean> ( --dynamic-value <boolean> )
        Upcast the value resulting from the expression to its dynamic type
        if available.

   -f <format> ( --format <format> )
        Specify a format to be used for display.

   -o ( --object-description )
        Print the object description of the value resulting from the
        expression.

   -t <unsigned-integer> ( --timeout <unsigned-integer> )
        Timeout value for running the expression.

   -u <boolean> ( --unwind-on-error <boolean> )
        Clean up program state if the expression causes a crash, breakpoint
        hit or signal.

超时: 如果可以静态评估表达式(无需运行代码),那么它将是。 否则,默认情况下,表达式将在当前线程上运行,但超时时间很短: 目前为 0.25 秒。如果在那个时间内没有返回,评估将被中断 并在所有线程运行的情况下恢复。您可以使用 -a 选项禁用所有重试 线程。您可以使用 -t 选项设置更短的超时时间。

用户定义变量: 为方便起见,您可以定义自己的变量或在后续表达式中使用。 您定义它们的方式与在 C 中定义变量的方式相同。如果 您的用户定义变量是 $,那么该变量的值将在未来可用 表达式,否则它只会在当前表达式中可用。

例子:

   expr my_struct->a = my_array[3] 
   expr -f bin -- (index * 8) + 5 
   expr unsigned int $foo = 5
   expr char c[] = "foo"; c[0]

重要提示:由于此命令采用“原始”输入,如果您使用任何 命令选项你必须在命令选项的结尾之间使用'--' 以及原始输入的开头。

【讨论】:

    【解决方案4】:

    不回答有关 Xcode 的问题,但 JetBrains 的 AppCode 以我们大多数人从其他平台知道的标准 IDE 方式执行此操作。

    【讨论】:

    • 这并没有回答关于 Xcode 的问题,但是在另一个 IDE 上的线索没有任何问题。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    • 2012-06-06
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多