前言
成都創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),微信小程序開發(fā),十余年建站對成都餐廳設(shè)計等多個方面,擁有豐富建站經(jīng)驗。
最近在開發(fā)直播,發(fā)現(xiàn)CPU性能被打滿后導(dǎo)致CPU降頻,發(fā)熱嚴(yán)重,然后卡頓…
為了定位這個問題我們花費了至少 3天的時間 一點一點跟蹤CPU的線程代碼,當(dāng)遇到C++的thread的時候沒有符號表,只能看見一坨對象地址,除此以外連個方法名都沒有的時候真是手足無措.本篇介紹一個高級調(diào)試 方法,使用符號表和相關(guān) 指令尋蹤 相關(guān)代碼調(diào)用,寫的不好 大佬們請輕噴.代碼相關(guān)過程感謝同事 陳豪的大力支持.
Talk is cheap show me the code
我們的實現(xiàn)思路是找到動態(tài)庫的首地址調(diào)用從此入手用相關(guān)指令恢復(fù)
前期準(zhǔn)備
build setting中開啟符號表
1.導(dǎo)入頭文件
#import
這是mac os的可執(zhí)行文件的動態(tài)鏈接庫頭文件 內(nèi)部內(nèi)建函數(shù)有幾個我們需要用到
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.打印
然后運行你的程序
然后看下控制臺 過濾一下 ASLR我們log中的鍵入內(nèi)容
然后 點擊 工程中的Product
右鍵 show in finder
下一步驟 打開終端 cd 到這這個目錄(可以打開終端 輸入 cd 空格 拖拽那個文件夾)
然后 pwd一下 看看
3.控制臺搜索相關(guān)我們打印log的代碼
找到我們第一條首地址
注意:這一步非常重要 如果不好使,請重試幾次.
拿出main函數(shù)的首地址 ASLR中搜搜的 首地址然后復(fù)制 回到終端中輸入
atos -arch arm64 -o com_kwai_gif.app.dSYM/Contents/Resources/DWARF/com_kwai_gif -l 0x1006b8000
注意:這里是符號表路徑,如果不知道在哪里找到請google一下.
我們來測試一下 好不好使
首先在控制臺頂部的面板點擊
然后 在 consolo中輸入 bt
如果看到 如下內(nèi)容說明已經(jīng)成功.
4.真機運行 找出未知線程
首先點擊Xcode工程中的Profile運行instruments,我這里是運行工程之后 Xcode9.4可以無縫轉(zhuǎn)換到instruments
我們找到相關(guān)線程 沒有名稱也不知道對象叫什么 就一個十六進制地址
我們隨便找個地址 在終端中輸入
好了 如果有問題 請刪除product和符號表重新編譯
總結(jié)
CPU調(diào)試的過程非常麻煩,而且中間過程的代碼多數(shù)都是C++的調(diào)用,主要是線程消耗的開銷,中有很多收獲希望大家多多指教.
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對創(chuàng)新互聯(lián)的支持。