十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
Xcode集成了LLDB,進(jìn)一步簡化了程序調(diào)試流程。雖然LLDB很強(qiáng)大,但是它的命令很有限。所幸的是,lldb包含了對python的支持,使得lldb的拓展成為可能。本人在開發(fā)過程中很喜歡使用image lookup 命令,但是苦于每次只能執(zhí)行一條,相當(dāng)耗時,因此一直想要找到一種批量執(zhí)行的方法。于是將目光放到了lldb python上......
網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計及定制網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)頁設(shè)計,高端網(wǎng)頁制作,對攪拌罐車等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)成都網(wǎng)站推廣優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。
#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腳本編碼,否則運(yùn)行時注釋中的中文將會報錯。
②運(yùn)行腳本時入口為 __lldb_init_module(debugger,internal_dict)
, 即先執(zhí)行函數(shù) __lldb_init_module(debugger,internal_dict)
中的內(nèi)容。debugger.HandleCommand是python中執(zhí)行l(wèi)ldb命令的主要方式。
③layne_imagelookup
是批量執(zhí)行image lookup命令的函數(shù),也是自定義的新的lldb命令的名稱。
④optparse
和shlex
是用于解析參數(shù)的兩個重要的庫。通過optparse來生成解析器。
在xcode中crash的時候,下方會出現(xiàn)lldb控制臺,輸入如下命令:command script import ~/Python/lldb/layne_command.py
回車之后將會出現(xiàn)一行提示:The "layne_imagelookup" python command has been installed and is ready for use(這個提示是事先定義在layne_command.py中的)。然后就可以在lldb控制臺像po
命令那樣使用layne_imagelookup了,使用方法:假如crash的時候出現(xiàn)的內(nèi)存地址為0x1111111 0x2222222 0x3333333 0x4444444 0x5555555
以前的做法是對每個地址使用image lookup -a命令:
(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
現(xiàn)在只需要:
(lldb)layne_imagelookup 0x1111111 0x2222222 0x3333333 0x4444444 0x5555555
結(jié)果將會以"************"分隔開顯示,如:
(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腳本有個缺點(diǎn):程序再次運(yùn)行之后,若還想使用自定義的命令,則必須再次調(diào)用command script import ~/Python/lldb/layne_command.py
,然后才能使用layne_imagelookup命令。因此這里配置一下使其自動加載。
原理:xcode啟動的時候會讀取一個默認(rèn)文件:~/.lldbinit
,只需要將命令command script import ~/Python/lldb/layne_command.py
寫入這個文件即可。
①打開Terminal,使用vim打開文件~/.lldbinit
(若沒有,vim會自動創(chuàng)建)。
②將命令command script import ~/Python/lldb/layne_command.py
寫入文件~/.lldbinit
,保存退出。 (注意:layne_command.py的路徑必須正確!)
以后只要xcode啟動起來就可以在lldb控制臺使用layne_imagelookup.