您好,登錄后才能下訂單哦!
承接上文,接下來講講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__)
然后來看下輸出吧:
文件有了,行號也有了,小伙伴們再也不擔心了。
然后呢?這些還不夠嘛……下面的這些內容是為了那些好學的小伙伴們,其余的可以自動忽略。
好了,終于做好了windows版本,到了各處顯擺的時候。什么,有bug,沒事,我早加了log的,讓我看下log……
呃,天啊……
于是,這時候,你就需要一個輸出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如何?不過這個就太復雜了,下次再開專門主題討論吧。
后記
這幾天陸陸續續把調試篇寫完了,需要能夠幫到各位。有問題啥的,可以直接聯系我,好了下次見。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。