lldb的若干技巧及拾遺

2021-09-19 10:50:02 字數 4095 閱讀 7718

以前有一陣覺得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"
根據日常開發的需要,aliasregex都可以用來當做開啟/關閉某些擴充套件功能,如第三方的除錯工具:

開啟/關閉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 continuecontinuec

thread step-overnextn

thread step-insteps

thread step-outfinish

thread return

thread return

thread return no

thread return @"hi"

framevariable

(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 行號 列出從第幾行開始的...