android ndknull 指標導致CRASH的問題

來源:互聯網
上載者:User

1. APP啟動時隔三差五地隨機性地CRASH,捕捉到的日誌:

----------------2013-06-03 10:26:52----------------#00  pc 0002e9b4  /data/data/com.XXXX.map/lib/libmapengine.so#01  lr 8082dc97  /data/data/com.XXXX.map/lib/libmapengine.so

2. CRASH在彙編碼2e9b4位置,通過objdump工具產生so包對應的彙編檔案,尋找定位crash位置:

0002e9b4 <_ZN12TextureCache15ensureCacheSizeEi>:   2e9b4:6803      ldrr3, [r0, #0]   2e9b6:428b      cmpr3, r1   2e9b8:da00      bge.n2e9bc <_ZN12TextureCache15ensureCacheSizeEi+0x8>   2e9ba:6001      strr1, [r0, #0]   2e9bc:4770      bxlr

第一行 2e9b4位置。

3. 對應ensureCacheSize函數源碼:

void TextureCache::ensureCacheSize(int size){if(limit < size){limit = size;}}

看到函數源碼以後,一時有點丈二摸不著頭腦了,函數內部就一個if判斷,何來的crash?2e9b4位置而且是一個ldr定址操作,根據彙編源碼得知是取limit成員變數值。

4. 跟一位經驗豐富地同事討論,他說這是典型地null 指標導致的CRASH問題,原因如下:

這個函數如此調用:tileTexCache->ensureCacheSize(blkNum + 1); 當tileTexCache指標為空白時,並不是在函數調用這行CRASH,而是在成員函數內部。

原理《C++物件模型》書中有講解:C++中類的成員函數和成員變數不太一樣,成員變數定義在對象內部,跟對象一個層級,與this指標有關;而成員函數則定義在類內部,跟類一個層級,與this指標無關。換個角度理解這句話,即使對象指標為空白,通過Null 物件指標訪問成員函數也是可以,只有當成員函數內部需要訪問成員變數時才會CRASH,因為成員變數定義在對象內部。這個道理我懂,但怎麼也跟null 指標聯絡起來!

5. 測試DEMO

class EmptyPointerApp {public:void safeFunc() {cout << "World Peace" << endl;}void badFunc() {cout << "Will Crash" << endl;mData = 1;}private:int mData;};int main(int argc, char** argv){EmptyPointerApp* pSample = NULL;pSample->safeFunc();pSample->badFunc();}

vs2008,CRASH在mData=1語句,此時輸出:

World PeaceWill Crash

調試中斷後開啟反組譯碼視窗:


第一個mov將this指標內容放到eax寄存器中,dword ptr指明了指令訪問記憶體的單元是一個dword,即四個位元組長度。

第二個mov通過eax訪問mData成員時CRASH!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.