lldb调试使用python脚本问题总结
lldb調(diào)試器可以使用python腳本實(shí)現(xiàn)功能增強(qiáng),但也不是可以隨心所欲的,在實(shí)際中有很多地方需要注意。
首先是對(duì)多線程環(huán)境調(diào)試使用python腳本,也要考慮python腳本有多線程安全,尤其是有許多任務(wù)繁重的工作線程,目標(biāo)函數(shù)許多線程同時(shí)在使用時(shí),腳本用到的全局變量就成了臨界資源。如果只是通常地是使用python實(shí)現(xiàn)增強(qiáng)調(diào)試指令,手工指令顯示結(jié)果,調(diào)試器運(yùn)行在交互狀態(tài),就不會(huì)想到使用python腳本也會(huì)多線程運(yùn)行。但是在做斷點(diǎn)catch調(diào)試時(shí),腳本自動(dòng)在各catch點(diǎn)觸發(fā)的線程上運(yùn)行,沒錯(cuò)python腳本運(yùn)行在多線程環(huán)境了。python腳本用鎖后,就要注意一個(gè)問題,鎖住的代碼塊要考慮腳本異常后,因?yàn)殒i沒有釋放使其它線程在catch點(diǎn)上餓死,影響了程序的運(yùn)行,當(dāng)然設(shè)計(jì)的調(diào)試自然就失敗(不工作,達(dá)不到目的)了。
第二,也是與catch調(diào)試情況相關(guān)的,就是要注意調(diào)試時(shí)調(diào)用了程序的函數(shù)與catch點(diǎn)之間是否存在依賴關(guān)系。如果存在依賴關(guān)系,catch點(diǎn)觸發(fā)的函數(shù)調(diào)用又使用了catch點(diǎn)的代碼,結(jié)果就是catch點(diǎn)遞歸觸發(fā),或者說這里鏈環(huán)。通常調(diào)試器會(huì)在這種情況輸出警告提示,"warning:hit point ..., skip the command...",就是調(diào)試器嘗試跳過catch點(diǎn)定下的操作,但是并不是總能有效。最后結(jié)果只有一個(gè),主線程被異常事件喚醒停在mach_msg_trap,也就是程序掛了。lldb比gdb在p指令多了一個(gè)打印對(duì)象的功能,這個(gè)功能并非由調(diào)試器實(shí)現(xiàn)的,而是調(diào)用了oc對(duì)象的description函數(shù),和NSLog打印oc對(duì)象一樣,調(diào)用了被打印的oc對(duì)象的函數(shù)。如果想在catch點(diǎn),通過以上兩種方法獲取oc對(duì)象的打印信息,這就要考慮以上兩種方法所依賴的函數(shù)或機(jī)制流程了。舉例,在_pthread*的函數(shù)集合,catch觸發(fā)操作打印一個(gè)oc字符串(po @"abc" 或 p (void)NSLog(@"abc")),調(diào)試?yán)^續(xù),悲劇隨即發(fā)生,程序掛了。因?yàn)橛|發(fā)的catch操作依賴了_pthread*的函數(shù)。跟著了catch觸發(fā)操作引起的流程循環(huán),如果你想在CFRunLoop里面的各步驟中,使用以上兩種打印對(duì)象信息的方法,就要當(dāng)心會(huì)不會(huì)引起了某個(gè)CFRunLoop的事件,又使得CFRunLoop因此又運(yùn)行在你的catch點(diǎn)上。我嘗試在RunLoop的observer點(diǎn)的回調(diào)函數(shù)catch打印info的信息,結(jié)果程序運(yùn)行就掛了。沒錯(cuò),你發(fā)現(xiàn)了,本篇寫的就是我踩過的坑。
第三,就是不要在python腳本中,通過HandleCommand執(zhí)行調(diào)試器指令來讀取寄存器,不要指望能正確讀出中斷現(xiàn)場(chǎng)的寄存器的值。因?yàn)閜ython腳本運(yùn)行在lldb之上,現(xiàn)在又由python調(diào)用lldb的命令(或指令),所以在這樣的情景下,lldb讀寄存器命令與程序中斷(或斷點(diǎn))現(xiàn)場(chǎng)就相隔著一層python,lldb調(diào)試命令很自然就不是在讀取程序斷點(diǎn)的現(xiàn)場(chǎng)。因此在python腳本就必須使用lldb.frame.register來讀取讀取程序斷點(diǎn)的現(xiàn)場(chǎng),因?yàn)檫@是python的lldb模塊對(duì)lldb調(diào)試器保存的寄存器現(xiàn)場(chǎng)進(jìn)行了keep one copy。
?
轉(zhuǎn)載于:https://www.cnblogs.com/bbqzsl/p/5530695.html
總結(jié)
以上是生活随笔為你收集整理的lldb调试使用python脚本问题总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置控件全局显示样式appearance
- 下一篇: row_number() over(pa