Xcode调试器:查看变量的值


107

我在UITableViewController中的代码:

delegate.myData = [myData objectAtIndex:indexPath.row];

如何在Debugger中查看delegate.myData或的值indexPath.rowdelegate.myData应该是一个数组和indexPath.row一个int。我只能看到物体的内存地址delegate,并indexPath在哪儿呢?myDatarow

替代文字

Answers:


142

检查此内容如何在Xcode调试器中查看NSDictionary变量的内容?

我也用

po variableName
print variableName

在控制台中。

在你的情况下可以执行

print [myData objectAtIndex:indexPath.row]  

要么

po [myData objectAtIndex:indexPath.row]

谢谢!我尝试了很多:“打印[myData objectAtIndex:indexPath.row]”,“ po [myData objectAtIndex:indexPath.row]”,“打印indexPath.row”,“ po indexPath.row”,但是每次我收到消息“没有名为行的成员”。这有效:“打印indexPath”和“ po indexPath”。因此,我尝试使用“ []”代替“。”:“ po [indexPath row]”->“无法打印NIL对象的描述。” “” po [indexPath getRow]“->”目标未响应此消息选择器。:-(
Manni

4
试试print(int)[indexPath row]
Andriy

po [myData objectAtIndex:(int)[indexPath row]]
Andriy

@VanDuTran我很确定po objswift中的等效于是po print(obj)
克里斯(Chris)

这也是查找计算属性值的理想选择。谢谢!
Paula Hasstenteufel

25

我同意其他张贴者的观点,即Xcode作为开发环境应该包括一种调试变量的简便方法。好,好消息,有一个!

搜索并没有找到有关如何在Xcode中调试变量的简单答案/教程之后,我去研究Xcode本身,发现此发现(至少对我而言)非常有用。

如何在Xcode 4.6.3中轻松调试变量

在Xcode的主屏幕中,通过单击屏幕快照中显示的右上角按钮,确保查看底部的调试区域。

调试区域按钮

Xcode 4.6.3中的调试区域

现在,通过单击“代码区域”的边框,设置一个断点-代码中您希望程序暂停的行。

断点

现在,在“调试区域”中查找此按钮,然后单击中间的一个。您会发现您的区域现在分为两部分。

分割调试区

应该看起来像这样

现在运行您的应用程序。

在程序执行过程中达到第一个断点时,您会在左侧看到该断点处所有可用的变量。

搜索领域

您可以展开变量上的向左箭头以获取更多详细信息。甚至可以使用搜索字段来隔离所需的变量,并在您“进入”断点范围时实时查看它的变化。

踏进

在调试区域的右侧,您可以使用鼠标的右键单击所需的变量来发送以打印所需的变量。

上下文菜单

如您所见,上下文菜单中充满了非常有趣的调试选项。例如,已经建议在键入命令中使用Watch,甚至可以使用Edit Value…来更改变量的运行时值!


21

您也可以:

  1. 设置一个断点以暂停执行。
  2. 该对象必须在执行范围内
  3. 将鼠标指针移到对象或变量上
  4. 会出现一个黄色的工具提示
  5. 将鼠标移到工具提示上
  6. 单击两个向上和向下的小箭头
  7. 将会弹出一个上下文菜单
  8. 选择“打印描述”,将执行一个[对象描述]
  9. 该描述将出现在控制台的输出中

恕我直言有点隐藏和麻烦...


在我的xcode中,“打印说明”不起作用,如何启用它?
Kirtikumar A.

@kirtiavaiya应用程序必须处于暂停状态,并且您的变量必须在当前要打印的范围内。同样,您不能直接打印“ self.variable”,但是可以使用Andriy解决方案来打印_ <变量的名称>。例如:对于self.btnHello,请在控制台中输入“ po _btnHello”(这仅在您未更改getter方法名称的情况下有效)
LightMan

@LightMan是,它像你说的,但后来也它不工作
Kirtikumar A.

10

造成混淆的原因是声明的属性不是(实例名称)变量(实例变量)。

表达

indexPath.row

相当于

[indexPath row]

和任务

delegate.myData = [myData objectAtIndex:indexPath.row];

相当于

[delegate setMyData:[myData objectAtIndex:[indexPath row]]];

假设标准名称为综合属性。

此外,delegate可能被声明为type id<SomeProtocol>,即,编译器当时无法提供实际的类型信息delegate,调试器依赖于编译时提供的信息。由于id是通用类型,因此中没有有关实例变量的编译时信息delegate

这些就是为什么您看不到变量myDatarow将变量视为变量的原因。

如果要检查发送-row或的结果-myData,可以使用命令ppo

p (NSInteger)[indexPath row]
po [delegate myData]

或使用表达式窗口(例如,如果您知道您delegate的类型是实际类型MyClass *,则可以添加一个表达式(MyClass *)delegate,或右键单击delegate,选择View Value as…并键入的实际类型,delegate例如MyClass *)。

话虽如此,我同意调试器可能会更有用:

  • 可能有一个选项告诉调试器窗口使用运行时类型信息而不是编译时信息。它会减慢调试器的速度,但是会提供有用的信息。

  • 声明的属性可以显示在称为属性的组中,并可以直接在调试器窗口中进行(可选)检查。这也将减慢调试器的速度,因为需要发送消息/执行方法以获得信息,但是也会提供有用的信息。


谢谢你的解释!这对我有很大帮助!:-)
Manni

7

您可以在运行时将值打印到控制台窗口上。以下是步骤:

  1. 放置要为其获取值的断点
  2. 现在执行分步调试。
  3. 将光标放在要在运行时检查其值的变量/代理上。
  4. 现在这将显示变量/委托的描述
  5. 点击“ i”将显示详细说明
  6. 这还将在控制台窗口上打印详细信息。

在控制台窗口上打印详细信息的屏幕截图


1
这样做对swift有用吗,我是swift的新手,无法像在obj c中看到的那样看到对象的值。
umairhhhs 2015年

1
@umairhhhs这篇文章仅适用于Objective-C。
Jayprakash Dubey

1
我想知道为什么它不在快速编辑器中,因为这非常有帮助并且节省时间。
umairhhhs 15-10-26

1

这变得有点复杂。这些对象是自定义类或结构,在Xcode中查找它们并不像在其他开发环境中那样容易。

如果您是我,我会用一些说明NSLog您想要查看的值。

即:

NSLog(@"Description of object & time: %i", indexPath.row);

11
是的,NSLog是可能的,但不是调试的舒适选择。我很惊讶没有办法显示所需的值。这属于开发环境的基本功能。
曼尼

2
关于XCode的最令人毛骨悚然的事情。可悲的。
ryan0

1

尝试运行->显示->表达式

输入数组的名称或您要查找的任何内容。


谢谢!我在表达式窗口中输入了“ indexPath.row”和“ delegate.myData”,但每次在“摘要”列中出现“超出范围” :-(
Manni

np,我遇到了同样的问题,直到找到它;)
tbone 2011年

1
在设置数组或其他内容后立即设置断点,您应该在表达式中找到该值。祝你好运
tbone 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.