Objective-C - 使用GDB打印方法参数

3

我希望你能帮我翻译一下关于it技术的内容,需要翻译的是如何使用GDB调试Objective-C程序。我有一个函数- (NSString *)reverse:(NSString *)someString需要调试。

以下是我设置断点的步骤:

(gdb) break -[MyClass reverse:]

现在,当代码到达断点时,我如何打印出self和方法参数的地址,甚至更好的是值?我已经做了一些谷歌搜索,并找到了像po $rdx这样的建议,但没有任何一个有效。如何解决这个问题?

如果您在XCode中运行程序,您将能够在调试窗口中查看您的self对象、变量和范围内的参数。 - Michael Dautermann
@MichaelDautermann:我不使用XCode。 - ryyst
3个回答

13

Clark Cox写了最好的解释,我找到过的。我一直参考这个页面,并制作了一个本地副本,以防它消失。

http://www.clarkcox.com/blog/2009/02/04/inspecting-obj-c-parameters-in-gdb/

x86_64和非浮点参数的快速版本是:

first ObjC arg => $rdx
second ObjC arg => $rcx
third ObjC arg => $r8
fourth ObjC arg => $r9

记住,在方法中传递的前两个参数(在$rdi和$rsi中)是self_cmd,这里不计算这些参数。

如果你要传递浮点数、结构体或超过四个参数,则情况会变得更加复杂,并且你应该阅读AMD64 ABI 3.2.3节中的调用约定。如果涉及到i386、PPC或ARM,请参阅Clark的帖子,它很好地涵盖了这些常见情况。


3

使用gdb进行调试时,您可以使用po和print()进行打印

po self
po someString


print (int) myInt

po的作用类似于NSLog(@"%@", self);print()的作用类似于NSLog(@"%d", myInt);

*你可以打印更多类型而不仅仅是int。


1
在你的类中实现description方法。你可以按照自己的喜好格式化值。来自文档的描述如下:

调试器的打印对象命令间接地调用此方法以生成对象的文本描述。


默认情况下,NSString 提供 description 方法吗? - ryyst
除非你的类是从NSString派生出来的,否则你将得到NSObject的默认实现,它并没有做太多事情。你可以在调试器中只需执行po self即可。 - logancautrell
但是我该如何打印方法参数(someString)? - ryyst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接