lua調用C++函數崩潰時,查看lua的調用棧資訊 (特別適用於tolua++)

來源:互聯網
上載者:User

        cocos2d-x這個開源引擎目前在移動開發領域挺火,我用了一陣子,非常喜歡它的lua綁定,一旦理解了其工作機制,用起來相比C++有不同的感受。

        但是想要用好lua指令碼,實在不是件容易的事情。要讓lua綁定變得非常好用,可能依然需要大量工作。

        這裡記錄一個很實用的技巧:在lua調用cocos2d-x的介面而導致崩潰時,無法直接看到lua的調用棧,也就無法知道目前正運行到lua指令碼的哪一行。此時可以考慮如下方法:

        就以cocos2d-x 2.0的HelloLua為例,假設lua指令碼在執行addChild時崩潰:

檔案:hello.lua

-- create farmlocal function createLayerFarm()    local layerFarm = CCLayer:create()print(debug.traceback())    -- add in farm background    local bg = CCSprite:create("farm.jpg")    bg:setPosition(winSize.width / 2 + 80, winSize.height / 2)    layerFarm:release()    --故意將layerFarm釋放,導致調用addChild時C++層異常    layerFarm:addChild(bg)    ........

        這樣,在執行到addChild時,程式最終會因為空白指標崩潰,具體是在tolua++產生的這個函數TOLUA_DISABLE_tolua_Cocos2d_CCNode_addChild00:

/* method: addChild of class  CCNode */#ifndef TOLUA_DISABLE_tolua_Cocos2d_CCNode_addChild00static int tolua_Cocos2d_CCNode_addChild00(lua_State* tolua_S){#ifndef TOLUA_RELEASE tolua_Error tolua_err; if (     !tolua_isusertype(tolua_S,1,"CCNode",0,&tolua_err) ||     !tolua_isusertype(tolua_S,2,"CCNode",0,&tolua_err) ||     !tolua_isnoobj(tolua_S,3,&tolua_err) )  goto tolua_lerror; else#endif {  CCNode* self = (CCNode*)  tolua_tousertype(tolua_S,1,0);  CCNode* child = ((CCNode*)  tolua_tousertype(tolua_S,2,0));#ifndef TOLUA_RELEASE  if (!self) tolua_error(tolua_S,"invalid 'self' in function 'addChild'", NULL);#endif  {          // 列印lua調用棧開始  lua_getglobal(tolua_S, "debug");  lua_getfield(tolua_S, -1, "traceback");  int iError = lua_pcall( tolua_S,    //VMachine                      0,    //Argument Count                      1,    //Return Value Count                      0 );   const char* sz = lua_tostring(tolua_S, -1);// 上面的sz裡面即為lua的調用棧資訊,好好利用吧!   self->addChild(child);  } } return 0;#ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S,"#ferror in function 'addChild'.",&tolua_err); return 0;#endif}#endif //#ifndef TOLUA_DISABLE

        如上面代碼中的注釋部分所示,具體就不說了。原理就是兩點:

1、lua執行時,隨時都可以調用 debug.traceback() 獲得描述調用棧的字串。

2、如上例,在C語言中調用debug.traceback 即可。C語言調用lua函數的方法屬於lua基礎內容,就不羅嗦了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.