2011-11-17 34 views
2

我正努力用GDB来调试我的Objective-C程序。我有一个我想调试的函数- (NSString *)reverse:(NSString *)someStringObjective-C - 使用GDB打印方法参数

以下是我设置的断点:

(gdb) break -[MyClass reverse:] 

现在,当代码到达断点,我怎么打印地址,甚至更好的self值和方法参数?我做了一些谷歌搜索,并找到像po $rdx这样的建议,但没有发现任何作品。

我该如何解决这个问题?

+0

在XCode中运行你的程序,你可以在Debug窗口中查看你的自己的对象,变量和范围参数。 –

+0

@MichaelDautermann:我不使用XCode。 – ryyst

回答

11

克拉克考克斯写了这个我找到的最好的解释。我一直提到这个页面,并且已经制作了本地副本,以防万一它消失。

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

快速版本的64位x86和非浮点参数是:

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的文章,该文章涵盖了那些适用于常见情况的案例。

1

在班级中实施description方法。不管你喜欢什么,你都可以格式化值。从文档:

调试器的print-object命令间接调用此方法来产生对象的文本描述。

+0

默认情况下'NSString'不提供'description'方法吗? – ryyst

+0

除非你的类是从NSString派生出来的,否则你得到的NSObject的默认实现并没有太大的作用。你可以在调试器中做po自我。 – logancautrell

+0

但是,如何打印方法参数('someString')? – ryyst

3

当使用gdb调试你可以用PO和打印()打印

po self 
po someString 


print (int) myInt 

po的作用就像NSLog(@"%@", self); print()的作用就像NSLog(@"%d", myInt);

*您可以打印多种类型的,如果你不是诠释