【问题标题】:XCode not stopping on breakpoint in method called from LLDBXCode 没有在从 LLDB 调用的方法中的断点处停止
【发布时间】:2016-06-22 00:48:38
【问题描述】:
  • XCode 7.2.1
  • iPad 视网膜 iOS 9.2 模拟器

我在 XCode 项目的特定类中设置了几个断点。 我在下面讨论的所有内容都发生在这个类文件中。

我通过单击装订线在-(int16_t)areaNbr 上设置断点,并且没有设置任何条件或任何东西。我通过在 LLDB 提示符下运行 breakpoint list 来确认它们就 LLDB 而言存在。

项目方案设置为调试而不是发布。

我在模拟器中运行项目,并在断点处停止以与所讨论的方法不同的方法,此时我想转到 LLDB提示并致电po [self areaNbr] 并单步执行areaNbr

请注意,因为这可能非常相关,我在项目本身中没有调用代码
-(int16_t)areaNbr

现在,如果我在调用该方法的项目中添加一些代码,我可以让它在 -(int16_t)areaNbr 的断点处停止。
例如,如果我添加类似NSLog(@"... %d", [self areaNbr])

我知道这个问题与编译掉该方法无关,因为没有任何东西调用它,因为如果这是真的,那么我对po [self areaNbr] 的调用不会将结果吐出到调试器窗口,如下图所示.所以该方法正在编译,并且肯定会被调试器识别为存在用于执行目的......只是不用于单步执行目的。

仅供参考,[self area] 正在返回“Area01”

在 LLDB 中调用 breakpoint list 会返回以下内容

【问题讨论】:

  • 如果你想得够久,你就会明白为什么 lldb 在从自身执行代码时不遵守断点。
  • 您不应该使用po 来打印uint16_t。 “po”是“print object”。对原始类型使用p
  • 试试expression -i false -- [self areaNbr]。祝你好运。
  • 我用附加信息对帖子进行了相当多的修改。是的@JoshCaswell,你说对了 po 是对象,但是,你会注意到po 实际上是有效的(如上图所示)。我的问题不在于po,而在于调用该方法不会触发断点这一事实。我用po 调用它,它实际上是在吐出正确的结果,它只是不会让我一步一步地完成这个方法。

标签: ios objective-c xcode lldb


【解决方案1】:

默认情况下,lldb 不会在手动调用代码中的断点处停止。大多数人使用exprexpr -O --po 来打印值和对象,如果他们停在他们为其他目的设置的断点处,他们会很恼火。

但是,控制这种行为很容易,只需使用:

(lldb) expr -i 0 -- [self areaNbr]

然后您将在断点处停止。

在这个例子中,我省略了 -O ,它是对象打印部分,因为如果你只想调用这个方法,你可能不关心在计算表达式后对结果调用 description

您可以通过以下方式查看表达式评估的所有选项:

(lldb) help expr

【讨论】:

  • Wallly guacamole'mole'mole... 这确实有效。太棒了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 2012-05-01
相关资源
最近更新 更多