Xcode集成了LLDB,進一步簡化了程序調試流程。雖然LLDB很強大,可是它的命令頗有限。所幸的是,lldb包含了對python的支持,使得lldb的拓展成爲可能。本人在開發過程當中很喜歡使用image lookup 命令,可是苦於每次只能執行一條,至關耗時,所以一直想要找到一種批量執行的方法。因而將目光放到了lldb python上......python
#coding=utf-8 #自定義lldb命令 import lldb import commands import optparse import shlex def layne_imagelookup(debugger, command, result, internal_dict): target = debugger.GetSelectedTarget() process = target.GetProcess() thread = process.GetSelectedThread() command_args = shlex.split(command) parser = create_custom_parser() try: (options, args) = parser.parse_args(command_args) except: result.SetError ("option parsing failed") return if args: for address in args: print("*************************************") debugger.HandleCommand('image lookup -a %s'%(address)) def create_custom_parser(): usage = "usage: %prog [options]" description = '''Parse Symbols to Human-readable Format.''' parser = optparse.OptionParser(description=description, prog='print_frame',usage=usage) # parser.add_option('-p','--parse',type='string',dest = 'parse',help='parse symbols.'); return parser def __lldb_init_module(debugger, internal_dict): debugger.HandleCommand('command script add -f layne_command.layne_imagelookup layne_imagelookup') print('The "layne_imagelookup" python command has been installed and is ready for use.')
而後保存爲文件layne_command.py,放到以下目錄(本身指定):~/Python/lldb/layne_command.py
說明:
①#coding=utf-8指定python腳本編碼,不然運行時註釋中的中文將會報錯。
②運行腳本時入口爲 __lldb_init_module(debugger,internal_dict)
, 即先執行函數 __lldb_init_module(debugger,internal_dict)
中的內容。debugger.HandleCommand是python中執行lldb命令的主要方式。
③layne_imagelookup
是批量執行image lookup命令的函數,也是自定義的新的lldb命令的名稱。
④optparse
和shlex
是用於解析參數的兩個重要的庫。經過optparse來生成解析器。 vim
在xcode中crash的時候,下方會出現lldb控制檯,輸入以下命令: command script import ~/Python/lldb/layne_command.py
回車以後將會出現一行提示:The "layne_imagelookup" python command has been installed and is ready for use(這個提示是事先定義在layne_command.py中的)。而後就能夠在lldb控制檯像po
命令那樣使用layne_imagelookup了,使用方法:假如crash的時候出現的內存地址爲 0x1111111 0x2222222 0x3333333 0x4444444 0x5555555
之前的作法是對每一個地址使用image lookup -a命令:xcode
(lldb)image lookup -a 0x1111111 (lldb)image lookup -a 0x2222222 (lldb)image lookup -a 0x3333333 (lldb)image lookup -a 0x4444444 (lldb)image lookup -a 0x5555555
如今只須要:app
(lldb)layne_imagelookup 0x1111111 0x2222222 0x3333333 0x4444444 0x5555555
結果將會以"************"分隔開顯示,如:ide
(lldb) layne_imagelookup 0x0000000107bcd914 0x000000010de2435a 0x000000010de2b245 0x000000010e1e6865 0x000000010e832998 ************************************* Address: Maketion[0x0000000100004914] (Maketion.__TEXT.__text + 8356) Summary: Maketion`-[AppDelegate application:didFinishLaunchingWithOptions:] + 196 at AppDelegate.m:251 ************************************* Address: UIKit[0x000000000002135a] (UIKit.__TEXT.__text + 128650) Summary: UIKit`-[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 267 ************************************* Address: UIKit[0x0000000000028245] (UIKit.__TEXT.__text + 157045) Summary: UIKit`-[UIApplication _runWithMainScene:transitionContext:completion:] + 1720 ************************************* Address: UIKit[0x00000000003e3865] (UIKit.__TEXT.__text + 4070293) Summary: UIKit`-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 249 ************************************* Address: UIKit[0x0000000000a2f998] (UIKit.__TEXT.__text + 10673352) Summary: UIKit`-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 231
手動加載自定義的python腳本有個缺點:程序再次運行以後,若還想使用自定義的命令,則必須再次調用command script import ~/Python/lldb/layne_command.py
,而後才能使用layne_imagelookup命令。所以這裏配置一下使其自動加載。
原理:xcode啓動的時候會讀取一個默認文件:~/.lldbinit
,只須要將命令command script import ~/Python/lldb/layne_command.py
寫入這個文件便可。
①打開Terminal,使用vim打開文件~/.lldbinit
(若沒有,vim會自動建立)。
②將命令command script import ~/Python/lldb/layne_command.py
寫入文件~/.lldbinit
,保存退出。 (注意:layne_command.py的路徑必須正確!)
之後只要xcode啓動起來就能夠在lldb控制檯使用layne_imagelookup.函數