以前有一陣覺得chisel真的挺好用的,後來翻看了歷年的wwdc關於lldb的video 還是發現一些tips
lldb 命令列都遵循上述格式,例如:
target create /bin/ls
breakpoint set —-name malloc
process attach --pid 1234
breakpoint set --file hello.c --line 100
breakpoint modify —condition 「self = $mymodel"
help
->h
expression -o --
->po
expression --
->p
thread until 11
->th u 11
breakpoint modify —condition "self = $mymodel"
->br m -c 「self == $mymodel"
lldb 啟動都會載入~/.lldbinit
,故而我們可以通過修改它來實現自己的增強
例如command alias
,常見的例子,譬如耳熟能詳的reveal
能通過下列命令啟動
我自己擴充套件了這個別名pwv
:
該命令可以列印keywindow上的view的層級結構。
同樣放在~/.lldbinit
,跟alias類似,不過可以帶引數,使用正則。
command regex pv 's/(.+)/expr (void)nslog((nsstring*)[(uiview*)%1 recursivedescription])/'
command regex postnoti 's/(.+)/expr (void)[[nsnotificationcenter defaultcenter] postnotificationname:%1 object:nil]/'
命令pv %1
用來列印%1
上的所有view的層級結構。
命令postnoti %1
用來post 乙個notication如:
(lldb) postnoti @"mynotification"
根據日常開發的需要,alias
和regex
都可以用來當做開啟/關閉某些擴充套件功能,如第三方的除錯工具:
開啟/關閉flex
command alias flex expr [[flexmanager sharedmanager] toggleexplorer]
regex
我用得也比較簡單,基本跟alias差不多。相信還會有更geek的用法。
chisel就是用下列命令初始化的:
command script import /path/to/fblldb.py
mycommands.py
def caflushcommand(debugger, command, result, internal_dict):
debugger.handlecommand("e (void)[catransaction flush]")
command script import ~/mycommands.py
lldb關於python的接**看得也不細,具體參見wwdc和lldb。chisel的github上也有講。
下列命令其意不言自明,日常其實不一定能用到,但thread return
在debug時還是相當有用的,除錯時發現某些bug,當重現步驟又太麻煩,不想修改**後重新編譯,可以在某些critical method中進行fake return。
process continue
continue
c
thread step-over
next
n
thread step-in
step
s
thread step-out
finish
thread return
thread return
thread return no
thread return @"hi"
fr
amev
ariable
(lldb) fr v self(myproject.viewcontroller) self = 0x00007fd63c221fa0
_hasalternatenextresponder = false
_hasinputassistantitem = false
}_overridetransitioningdelegate = nil
以下省略
(lldb) register read
general purpose registers:
rax = 0x0000000010004005
rbx = 0x00000000ffffffff
rcx = 0x00007fff5559b718
rdx = 0x0000000000000000
rdi = 0x00007fff5559b880
rsi = 0x0000000007000806
rbp = 0x00007fff5559b760
rsp = 0x00007fff5559b718
r8 = 0x0000000000001403
r9 = 0x00000000ffffffff
r10 = 0x0000000000000c00
r11 = 0x0000000000000206
r12 = 0x0000000000000c00
r13 = 0x0000000000000000
r14 = 0x00007fff5559b880
r15 = 0x0000000000001403
rip = 0x000000010e151386 libsystem_kernel.dylib`mach_msg_trap + 10
rflags = 0x0000000000000206
cs = 0x000000000000002b
fs = 0x0000000000000000
gs = 0x0000000000000000
(lldb)platform shell ls
(lldb) br s -e objc
(lldb) type lookup errortype
protocol errortype
var _code: swift.int
}extension errortype
}}
(lldb) p nslog(@「%d」, i)
error: 'nslog' has unknown return type;
cast the call to its declared return type
error: 1 errors parsing expression
error: 1 errors parsing expression
這些問題都修好了。
其他的以後再補充。
有些東西其實對於大多數開發者用處不大,大家隨便看看。
原作寫於segmentfault 鏈結
工具和技巧拾遺
create view view name as select column name s from table name where condition 例如 求所有人物對應的掌門名稱 create view v ceo as select emp.name,ceo.name as ceoname...
Linux基礎指令及拾遺
一 cd 切換命令 cd 檔名 切換到指定檔名下 cd 返回上一級 cd 檔名 切換到上一級的指定檔名下 cd 檔名 切換到當前目錄下的指定檔名下 cd 切換到上一次cd命令 二 ls 列出命令 ls 直接列出當前目錄下的所有資料夾與檔案 ls l 列出當前目錄下所有資料夾與檔案及其許可權和其他資訊...
C拾遺(一)gdb的使用
gdb基本命令 命令 描述backtrace bt 檢視各級函式呼叫及引數 finish 連續執行到當前函式返回為止,然後等待命令 frame f 選擇棧幀 info i locals 檢視當前綻幀區域性變數 list l 列出源 接著上次的位置往下列,每次10行 list 行號 列出從第幾行開始的...