2
對於前 - 你有TextEdit應用程序,當你保存文件時,我想知道哪些objective-c方法被調用。我有使用類轉儲的Textedit頭文件。如何在運行時爲Mac上的任何應用程序找到objective-c方法?
是否有任何方法知道這些方法(我們從類轉儲輸出)在運行時被調用?
有沒有辦法用dtrace做?
對於前 - 你有TextEdit應用程序,當你保存文件時,我想知道哪些objective-c方法被調用。我有使用類轉儲的Textedit頭文件。如何在運行時爲Mac上的任何應用程序找到objective-c方法?
是否有任何方法知道這些方法(我們從類轉儲輸出)在運行時被調用?
有沒有辦法用dtrace做?
假設Objective-C的方法直接轉化到用戶空間的函數調用,你應該能夠使用the DTrace pid provider:
的
pid
提供的
pid
提供商,可以跟蹤任何指令 進程。與大多數其他提供商不同,pid
探針是根據 需求創建的,具體取決於D程序中的探針描述。用戶函數邊界跟蹤
最簡單的工作模式爲
pid
提供商是作爲用戶 空間類似物到fbt
提供商。以下示例程序 會跟蹤由單個 函數生成的所有函數條目和返回值。$1
宏變量擴展爲 命令行中的第一個操作數。此宏變量是過程的進程ID,以 跟蹤。$2
宏變量擴展爲 命令行上的第二個操作數。這個宏變量是函數調用的所有函數的名稱。例4-3
userfunc.d
:跟蹤用戶函數輸入,並返回pid$1::$2:entry { self->trace = 1; } pid$1::$2:return /self->trace/ { self->trace = 0; } pid$1:::entry, pid$1:::return /self->trace/ { }
該腳本產生輸出是類似於下面的示例:
# ./userfunc.d 15032 execute dtrace: script './userfunc.d' matched 11594 probes 0 -> execute 0 -> execute 0 -> Dfix 0 <- Dfix 0 -> s_strsave 0 -> malloc 0 <- malloc 0 <- s_strsave 0 -> set 0 -> malloc 0 <- malloc 0 <- set 0 -> set1 0 -> tglob 0 <- tglob 0 <- set1 0 -> setq 0 -> s_strcmp 0 <- s_strcmp ...
感謝您的信息。但我需要更多。我有TextEdit的類轉儲。在那我想知道是否 - (BOOL)validateMenuItem:(id)arg1;類Document的執行與否。所以我用你的腳本,並用dtrace -s userfunc.d 1102 * validateMenuItem * ...執行它表示探針描述不匹配。該怎麼辦?? –
@hrishikeshchaudhari函數名可能不完全是'validateMenuItem'。這可能[mangled](https://en.wikipedia.org/wiki/Name_mangling)。我不熟悉OS X說什麼工具可用於在二進制文件中查找實際損壞的函數名稱。 'strings -a/bin/file | grep -i validateMenuItem' *可能*工作。這可能有所幫助:http://stackoverflow.com/questions/4506121/how-to-print-a-list-of-symbols-exported-from-a-dynamic-library將DTrace腳本縮短爲像「pid $ 1: :: entry {}'可能會發出進程所做的所有*函數調用。我現在無法測試。 –
你可能是對的,功能被破壞了。現在只有通過逆向工程或反覆試驗才能做到這一點。我真的很想知道人們是怎麼做的。逆向工程可能需要幾天的時間才能找到確切的功能來進行攪拌。 –