2016-11-22 49 views

回答

0

假設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       
... 
+0

感謝您的信息。但我需要更多。我有TextEdit的類轉儲。在那我想知道是否 - (BOOL)validateMenuItem:(id)arg1;類Document的執行與否。所以我用你的腳本,並用dtrace -s userfunc.d 1102 * validateMenuItem * ...執行它表示探針描述不匹配。該怎麼辦?? –

+0

@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 {}'可能會發出進程所做的所有*函數調用。我現在無法測試。 –

+0

你可能是對的,功能被破壞了。現在只有通過逆向工程或反覆試驗才能做到這一點。我真的很想知道人們是怎麼做的。逆向工程可能需要幾天的時間才能找到確切的功能來進行攪拌。 –

相關問題