我想知道将异常断点调试器命令设置为以下情况时,在调试器中得到的内容是否有区别:
po $ arg1
vs
bt
如果是这样,您能给我解释一下这些区别是什么,也许哪个更有益(如果受益是有条件的,则在什么情况下)?
我在教程中都看过这两个建议,但是我不确定哪个更好。谢谢。
答案 0 :(得分:2)
bt
是thread backtrace
的一个有点花哨的lldb快捷方式。 bt
将向您显示使您到达断点的呼叫顺序。如果堆栈上的任何调用函数具有调试信息,则lldb还将向该函数输出参数。这是您遇到断点时最有用的操作,因为它可以回答更一般的“我在哪里”问题。
po $arg1
是更专业的东西。
$arg1
是lldb的缩写,用于将第一个参数传递给函数的寄存器。如果您使用的是函数的第一条指令,则该寄存器将保存调用该函数时传递的值。但是请注意,$arg1
实际上只是一个寄存器名称,因此,如果该寄存器被重用-例如,当您停止在该函数中调用另一个函数时,传入的参数值将被覆盖。因此,$arg1
仅在函数开始时停止时才表示“第一个参数”。
po
是expr -O --
的简写。它评估它传递的表达式,然后如果结果是ObjC或Swift对象,则调用运行时以检索该对象的自定义描述并进行打印。否则,它将打印该值。
因此,po $arg1
将您的第一个参数的对象描述打印到某个函数(如果您在该函数的开头停止了)。最常见的用法是所有ObjC方法都将self
参数作为第一个参数。因此,如果您停止在方法的开头,po $arg1
将打印self
参数的对象描述。