iOS中CPU線程調(diào)試的高級(jí)技巧分享
前言
最近在開(kāi)發(fā)直播,發(fā)現(xiàn)CPU性能被打滿(mǎn)后導(dǎo)致CPU降頻,發(fā)熱嚴(yán)重,然后卡頓…
為了定位這個(gè)問(wèn)題我們花費(fèi)了至少 3天的時(shí)間 一點(diǎn)一點(diǎn)跟蹤C(jī)PU的線程代碼,當(dāng)遇到C++的thread的時(shí)候沒(méi)有符號(hào)表,只能看見(jiàn)一坨對(duì)象地址,除此以外連個(gè)方法名都沒(méi)有的時(shí)候真是手足無(wú)措.本篇介紹一個(gè)高級(jí)調(diào)試 方法,使用符號(hào)表和相關(guān) 指令尋蹤 相關(guān)代碼調(diào)用,寫(xiě)的不好 大佬們請(qǐng)輕噴.代碼相關(guān)過(guò)程感謝同事 陳豪的大力支持.
Talk is cheap show me the code
我們的實(shí)現(xiàn)思路是找到動(dòng)態(tài)庫(kù)的首地址調(diào)用從此入手用相關(guān)指令恢復(fù)
前期準(zhǔn)備
build setting中開(kāi)啟符號(hào)表
1.導(dǎo)入頭文件
#import <mach-o/dyld.h>
這是mac os的可執(zhí)行文件的動(dòng)態(tài)鏈接庫(kù)頭文件 內(nèi)部?jī)?nèi)建函數(shù)有幾個(gè)我們需要用到
2.復(fù)制下面代碼到你的相關(guān)調(diào)用的地方
//1 uint32_t count = _dyld_image_count(); DDLogInfo(@"Dyld image count %d", count); //2 for (int i = 0; i < count; i++) { char *image_name = (char *)_dyld_get_image_name(i); //3 const struct mach_header *mh = _dyld_get_image_header(i); intptr_t vmaddr_slide = _dyld_get_image_vmaddr_slide(i); //4 NSLog(@"Image name %s at address 0x%llx and ASLR slide 0x%lx.\n", image_name, (mach_vm_address_t)mh, vmaddr_slide); }
我解釋一下以上代碼
1.拿出當(dāng)前鏡像數(shù)量
2.遍歷鏡像
3.獲取鏡像首地址
4.打印
然后運(yùn)行你的程序
然后看下控制臺(tái) 過(guò)濾一下 ASLR我們log中的鍵入內(nèi)容
然后 點(diǎn)擊 工程中的Product
右鍵 show in finder
下一步驟 打開(kāi)終端 cd 到這這個(gè)目錄(可以打開(kāi)終端 輸入 cd 空格 拖拽那個(gè)文件夾)
然后 pwd一下 看看
3.控制臺(tái)搜索相關(guān)我們打印log的代碼
找到我們第一條首地址
注意:這一步非常重要 如果不好使,請(qǐng)重試幾次.
拿出main函數(shù)的首地址 ASLR中搜搜的 首地址然后復(fù)制 回到終端中輸入
atos -arch arm64 -o com_kwai_gif.app.dSYM/Contents/Resources/DWARF/com_kwai_gif -l 0x1006b8000
注意:這里是符號(hào)表路徑,如果不知道在哪里找到請(qǐng)google一下.
我們來(lái)測(cè)試一下 好不好使
首先在控制臺(tái)頂部的面板點(diǎn)擊
然后 在 consolo中輸入 bt
如果看到 如下內(nèi)容說(shuō)明已經(jīng)成功.
4.真機(jī)運(yùn)行 找出未知線程
首先點(diǎn)擊Xcode工程中的Profile運(yùn)行instruments,我這里是運(yùn)行工程之后 Xcode9.4可以無(wú)縫轉(zhuǎn)換到instruments
我們找到相關(guān)線程 沒(méi)有名稱(chēng)也不知道對(duì)象叫什么 就一個(gè)十六進(jìn)制地址
我們隨便找個(gè)地址 在終端中輸入
好了 如果有問(wèn)題 請(qǐng)刪除product和符號(hào)表重新編譯
總結(jié)
CPU調(diào)試的過(guò)程非常麻煩,而且中間過(guò)程的代碼多數(shù)都是C++的調(diào)用,主要是線程消耗的開(kāi)銷(xiāo),中有很多收獲希望大家多多指教.
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
IOS ObjectC與javascript交互詳解及實(shí)現(xiàn)代碼
這篇文章主要介紹了IOS OC與js交互詳解及實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03IOS App 無(wú)代碼入侵的方法hook詳細(xì)介紹
這篇文章主要介紹了IOS App 無(wú)代碼入侵的方法hook詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-12-12iOS中tableview 兩級(jí)cell的展開(kāi)與收回的示例代碼
本篇文章主要介紹了iOS中tableview 兩級(jí)cell的展開(kāi)與收回的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-03-03iOS CAEmitterLayer實(shí)現(xiàn)粒子發(fā)射動(dòng)畫(huà)效果
這篇文章主要為大家詳細(xì)介紹了iOS CAEmitterLayer 實(shí)現(xiàn)粒子發(fā)射動(dòng)畫(huà)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06解決iOS下無(wú)法觸發(fā)focus事件的問(wèn)題
今天小編就為大家分享一篇解決iOS下無(wú)法觸發(fā)focus事件的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08iOS實(shí)現(xiàn)輪盤(pán)動(dòng)態(tài)效果
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)輪盤(pán)動(dòng)態(tài)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04iOS 中 使用UITextField格式化銀行卡號(hào)碼的解決方案
今天小編給大家分享ios中使用UITextField格式化銀行卡號(hào)碼的實(shí)現(xiàn)思路詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2016-12-12