2011-11-17 38 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);

*您可以打印多種類型的,如果你不是詮釋