中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【cocos2dx進階】調試篇(3)cocos2dx的Log改造

發布時間:2020-07-04 17:22:03 來源:網絡 閱讀:4642 作者:kingzeus 欄目:開發技術

承接上文,接下來講講CCLOG這個宏的一些調整。


很多時候,調試程序不能斷點,或者不方便斷點的時候,就只能靠LOG輸出了,所以,一個方便的LOG

函數對于調試的幫助是巨大的。

什么才算方便呢?

  • 能顯示需要的內容,中文不亂碼

  • 能方便的定位輸出內容的代碼位置


好了,那就開始吧,CCLOG的輸出支持中文,當然不是直接寫中文,而是utf8格式,怎么獲得呢,用字符串直接轉就行了,還不會?好吧,下次專門說下吧。


這次的重頭戲來了,如何方便的定位輸出內容的代碼位置,這個真的很重要,能根據輸出反查到代碼,就再也不需要設置唯一的輸出字符了。


C++的編譯器其實支持了很多預定義的宏:

說明
__DATE__當前代碼文件的編譯日期。格式: Mmm dd yyyy,生成的格式和 ‘’asctime(定義于TIME.H)‘’生成的日期格式一致
__FILE__當前代碼文件的文件名。
__LINE__當前代碼文件的行號。
__TIME__當前代碼文件的編譯時間。格式: hh:mm:ss,24 小時制
__STDC__如果編譯C代碼,值為1;其他情況,值未定義(undefined)
__func__當前的函數名。新的ANSI/ISO C99 標準

接下來,直接上代碼:

#define KZLOG(format,...) cocos2d::CCLog("%s,%d:"format,__FILE__,__LINE__, ##__VA_ARGS__)
#define KZERROR(format,...) cocos2d::CCLog("%s,%d:[error]"format,__FILE__,__LINE__, ##__VA_ARGS__)

然后來看下輸出吧:

【cocos2dx進階】調試篇(3)cocos2dx的Log改造

文件有了,行號也有了,小伙伴們再也不擔心了。


然后呢?這些還不夠嘛……下面的這些內容是為了那些好學的小伙伴們,其余的可以自動忽略。

好了,終于做好了windows版本,到了各處顯擺的時候。什么,有bug,沒事,我早加了log的,讓我看下log……

呃,天啊……

于是,這時候,你就需要一個輸出log的地方,它在哪里…………

【cocos2dx進階】調試篇(3)cocos2dx的Log改造

命令行窗口?這個可以有,好了,不多說,直接上代碼

// ConsoleWinApp.cpp : implementation file
//
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#define _CONSOLEWIN
#ifdef _CONSOLEWIN
//Set subsystem to console
#pragma comment ( linker, "/subsystem:console" )
BOOL WINAPI ConsoleWinHandlerRoutine( DWORD dwCtrlType )
{
   // Signal type
   switch( dwCtrlType )
   {
   case CTRL_C_EVENT:
   case CTRL_BREAK_EVENT:
   case CTRL_CLOSE_EVENT:
   case CTRL_LOGOFF_EVENT:
   case CTRL_SHUTDOWN_EVENT:
      // You can stop here gracefully:
      //
      // AfxGetMainWnd()->SendMessage( WM_CLOSE, 0, 0 );
      // WaitForSingleObject( AfxGetThread(), INFINITE );
      //
      ExitProcess(0);
      break;
   }
   return TRUE;
}
// Console main function
int _tmain( DWORD, TCHAR**, TCHAR** )
{
#define SPACECHAR   _T(' ')
#define DQUOTECHAR  _T('\"')
   // Set the new handler
   SetConsoleCtrlHandler( ConsoleWinHandlerRoutine, TRUE );
   // Get command lin
    LPTSTR lpszCommandLine = ::GetCommandLine();
    if(lpszCommandLine == NULL)
        return -1;
    // Skip past program name (first token in command line).
    // Check for and handle quoted program name.
    if(*lpszCommandLine == DQUOTECHAR)
    {
        // Scan, and skip over, subsequent characters until
        // another double-quote or a null is encountered.
        do
        {
            lpszCommandLine = ::CharNext(lpszCommandLine);
        }
        while((*lpszCommandLine != DQUOTECHAR) && (*lpszCommandLine != _T('\0')));
        // If we stopped on a double-quote (usual case), skip over it.
        if(*lpszCommandLine == DQUOTECHAR)
            lpszCommandLine = ::CharNext(lpszCommandLine);
    }
    else
    {
        while(*lpszCommandLine > SPACECHAR)
            lpszCommandLine = ::CharNext(lpszCommandLine);
    }
    // Skip past any white space preceeding the second token.
    while(*lpszCommandLine && (*lpszCommandLine <= SPACECHAR))
        lpszCommandLine = ::CharNext(lpszCommandLine);
    STARTUPINFO StartupInfo;
    StartupInfo.dwFlags = 0;
    ::GetStartupInfo(&StartupInfo);
    return _tWinMain(::GetModuleHandle(NULL), NULL, lpszCommandLine,
        SW_SHOW/*(StartupInfo.dwFlags & STARTF_USESHOWWINDOW) ?
        StartupInfo.wShowWindow : SW_HIDE*/);
}
#endif // _CONSOLEWIN

用法其實很簡單,把這個文件編譯進工程,然后就見證奇跡吧……


再然后呢?這些還不夠嘛……不夠嗎?好吧,下面的這些內容是為了更加好學的小伙伴們,其余的可以自動忽略。

好了,再編譯個手機版,然后再去顯擺下……

什么,有bug,沒事,我早加了log的,讓我看下log……

呃,天啊……

好了,不是調試的話,怎么查看log呢?好吧,我們寫下來吧。

void kzlib::CUtility::Log(const char* szMsg)
{
#if (COCOS2DX_VER==1)
    kz_string strFile(cocos2d::CCFileUtils::sharedFileUtils()->getWritablePath());
#else
    kz_string strFile(cocos2d::CCFileUtils::sharedFileUtils()->getWriteablePath());
#endif
    strFile += m_strLogFile;
    FILE *fp = fopen(strFile.c_str(), "a+");
    fwrite(szMsg,1, strlen(szMsg),fp);
    fclose(fp);
}

好了,這個怎么用,就當作業吧,大家可以好好發揮下。


那么,再接下去呢?crash report如何?不過這個就太復雜了,下次再開專門主題討論吧。


后記


這幾天陸陸續續把調試篇寫完了,需要能夠幫到各位。有問題啥的,可以直接聯系我,好了下次見。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凤庆县| 合山市| 怀柔区| 张北县| 九寨沟县| 隆子县| 民和| 二手房| 吴桥县| 麟游县| 老河口市| 正定县| 佛冈县| 扬中市| 阜平县| 丹棱县| 房山区| 营口市| 定南县| 策勒县| 翁牛特旗| 商城县| 卢氏县| 余庆县| 萨迦县| 达日县| 雅江县| 隆昌县| 南阳市| 通州区| 贵定县| 东莞市| 吴川市| 宜川县| 麻江县| 昌平区| 上蔡县| 巨鹿县| 罗田县| 策勒县| 太湖县|