2013-10-04 284 views
11

我在Xcode中使用lldb,其中一個變量包含大量的JSON數據。使用po myVar對分析此數據沒有太大幫助,因爲它將在微小的Xcode調試控制檯中輸出。將lldb輸出重定向到文件

有沒有辦法將lldb輸出重定向到文件?

我看到here,這樣的功能似乎是可在GDB爲:

(gdb) set logging on 
(gdb) set logging file /tmp/mem.txt 
(gdb) x/512bx 0xbffff3c0 
(gdb) set logging off 

和LLDB被 「翻譯」 爲:

(lldb) memory read --outfile /tmp/mem.txt --count 512 0xbffff3c0 
(lldb) me r -o/tmp/mem.txt -c512 0xbffff3c0 
(lldb) x/512bx -o/tmp/mem.txt 0xbffff3c0 

然而,memory read命令不會幫助我的情況,並且--outfile似乎不可用於print命令。

回答

11

您可以使用Python腳本這樣做(和更多),因爲這裏說明:

LLDB Python scripting in Xcode

創建一個在你的選擇(例如「目錄名爲po.py文件〜 /.lldb「):

import lldb 

def print_to_file(debugger, command, result, dict): 
    #Change the output file to a path/name of your choice 
    f=open("/Users/user/temp.txt","w") 
    debugger.SetOutputFileHandle(f,True); 
    #Change command to the command you want the output of 
    command = "po self" 
    debugger.HandleCommand(command) 

def __lldb_init_module (debugger, dict): 
    debugger.HandleCommand('command script add -f po.print_to_file print_to_file ') 
在調試控制檯寫

然後:

comma script import ~/.lldb/po.py 
print_to_file 
+1

改進:爲什麼不把命令的參數 - 那麼你可以說「print_to_file po self」?另外,我還沒有檢查LLDB是否爲你自動重置句柄,但重置輸出文件句柄似乎是一個好習慣:)最後,實際上你可以爲「下級命令」獲取SBCommandReturnObject(po自我例如)並將其寫入文件而不是劫持lldb的stdout。如果完全可以避免的話,我通常會對使用stdin/stdout的方式進行嘗試。 –

+2

有沒有辦法將* all * debugger的輸出重定向到一個文件? 我試過上面的腳本沒有'HandleCommand'行,它沒有工作。 – blackwing

+1

恩里科,你可以考慮展示一個你自己的例子/答案,改善這一個?我喜歡你的方法的聲音,但我沒有足夠的信息來測試它。 – insitusec

0

這裏是結合一些從上述評論的一個輕微的修改:

def toFile(debugger, command, result, dict): 
    f=open("/Users/user/temp.txt","w") 
    debugger.SetOutputFileHandle(f,True); 
    debugger.HandleCommand(command) 
    f.close() 
    debugger.SetOutputFileHandle(sys.stdout, True) 

這允許命令到作爲參數提供,並且將恢復的輸出文件句柄運行命令後到stdout。