断点调试器命令中的`po $ arg1`和`bt`之间有区别吗?

时间:2019-01-23 18:49:52

标签: ios xcode debugging breakpoints crash-reports

我想知道将异常断点调试器命令设置为以下情况时,在调试器中得到的内容是否有区别:

  

po $ arg1

vs

  

bt

如果是这样,您能给我解释一下这些区别是什么,也许哪个更有益(如果受益是有条件的,则在什么情况下)?

我在教程中都看过这两个建议,但是我不确定哪个更好。谢谢。

1 个答案:

答案 0 :(得分:2)

btthread backtrace的一个有点花哨的lldb快捷方式。 bt将向您显示使您到达断点的呼叫顺序。如果堆栈上的任何调用函数具有调试信息,则lldb还将向该函数输出参数。这是您遇到断点时最有用的操作,因为它可以回答更一般的“我在哪里”问题。

po $arg1是更专业的东西。

$arg1是lldb的缩写,用于将第一个参数传递给函数的寄存器。如果您使用的是函数的第一条指令,则该寄存器将保存调用该函数时传递的值。但是请注意,$arg1实际上只是一个寄存器名称,因此,如果该寄存器被重用-例如,当您停止在该函数中调用另一个函数时,传入的参数值将被覆盖。因此,$arg1仅在函数开始时停止时才表示“第一个参数”。

poexpr -O --的简写。它评估它传递的表达式,然后如果结果是ObjC或Swift对象,则调用运行时以检索该对象的自定义描述并进行打印。否则,它将打印该值。

因此,po $arg1将您的第一个参数的对象描述打印到某个函数(如果您在该函数的开头停止了)。最常见的用法是所有ObjC方法都将self参数作为第一个参数。因此,如果您停止在方法的开头,po $arg1将打印self参数的对象描述。