2013-05-02 117 views
1

我跟蹤到了OS X應用程序,我希望能找到像這樣在iOS上的方式:LLDB objc_msgSend跟蹤在OS X

lldb Xcode: error: 'printf' is not a valid command

有沒有辦法做到這樣嗎?我試過

expr -- (void)printf("[%s, %s]\n",(char *) object_getClassName(*(long*)($esp+4)), (char *) *(long *)($esp+8)) 

我覺得OS X是64位寄存器。所以這個命令不能工作(的確,它不起作用)。我應該如何編寫這個命令?或者有一個簡單的方法來做同樣的事情?只需追蹤名爲

回答

6

上面引用的命令只適用於在Mac上作爲i386進程運行的iOS Simulator應用程序。 $esp+4表示第一個參數,$esp+8表示在i386 ABI中傳遞的第二個參數。在x86_64和arm上,前幾個參數通過$arg1,$arg2便利名稱傳遞到寄存器中。所以請嘗試

p (void)printf("[%s, %s]\n", (char*)object_getClassName($arg1), $arg2) 

for arm/x86_64體系結構。 (當然,p在這裏是expr --的別名 - 同樣的東西,只是少打字。)

+0

看來,printf不打印lldb中的東西(如(char *)object_getClassName($ arg1),它的工作原理)。我如何獲得輸出打印? – 2013-05-03 00:28:41

+0

你在調試什麼?在設備上運行的iOS項目? GUI Mac應用程序(大概是x86_64)?使用命令行lldb的命令行mac程序?附加到正在運行的進程?當你這樣做的時候,你在你的實際程序中運行'printf',這樣輸出就會去'stdout'打印的地方... – 2013-05-03 03:51:37

+0

順便說一句,你不需要通過printf來打印。你可以在lldb中說'p(char *)object_getClassName($ arg1)'和'p $ arg2',避免程序輸出進行的麻煩。 – 2013-05-03 04:01:19