【cocos2dx进阶】调试篇(3)cocos2dx的Log改造 推荐
2014-01-23 17:09
351 查看
承接上文,接下来讲讲CCLOG这个宏的一些调整。
很多时候,调试程序不能断点,或者不方便断点的时候,就只能靠LOG输出了,所以,一个方便的LOG
函数对于调试的帮助是巨大的。
什么才算方便呢?
能显示需要的内容,中文不乱码
能方便的定位输出内容的代码位置
好了,那就开始吧,CCLOG的输出支持中文,当然不是直接写中文,而是utf8格式,怎么获得呢,用字符串直接转就行了,还不会?好吧,下次专门说下吧。
这次的重头戏来了,如何方便的定位输出内容的代码位置,这个真的很重要,能根据输出反查到代码,就再也不需要设置唯一的输出字符了。
C++的编译器其实支持了很多预定义的宏:
接下来,直接上代码:
![](http://s3.51cto.com/wyfs02/M01/11/DC/wKiom1Lg1h_gLOHvAACoe5urkko286.jpg)
文件有了,行号也有了,小伙伴们再也不担心了。
然后呢?这些还不够嘛……下面的这些内容是为了那些好学的小伙伴们,其余的可以自动忽略。
好了,终于做好了windows版本,到了各处显摆的时候。什么,有bug,没事,我早加了log的,让我看下log……
呃,天啊……
于是,这时候,你就需要一个输出log的地方,它在哪里…………
![](http://s3.51cto.com/wyfs02/M01/11/DB/wKioL1Lg2JLC0e21AALqo8ZqZRI975.jpg)
命令行窗口?这个可以有,好了,不多说,直接上代码
再然后呢?这些还不够嘛……不够吗?好吧,下面的这些内容是为了更加好学的小伙伴们,其余的可以自动忽略。
好了,再编译个手机版,然后再去显摆下……
什么,有bug,没事,我早加了log的,让我看下log……
呃,天啊……
好了,不是调试的话,怎么查看log呢?好吧,我们写下来吧。
那么,再接下去呢?crash report如何?不过这个就太复杂了,下次再开专门主题讨论吧。
后记
这几天陆陆续续把调试篇写完了,需要能够帮到各位。有问题啥的,可以直接联系我,好了下次见。
很多时候,调试程序不能断点,或者不方便断点的时候,就只能靠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__)然后来看下输出吧:
![](http://s3.51cto.com/wyfs02/M01/11/DC/wKiom1Lg1h_gLOHvAACoe5urkko286.jpg)
文件有了,行号也有了,小伙伴们再也不担心了。
然后呢?这些还不够嘛……下面的这些内容是为了那些好学的小伙伴们,其余的可以自动忽略。
好了,终于做好了windows版本,到了各处显摆的时候。什么,有bug,没事,我早加了log的,让我看下log……
呃,天啊……
于是,这时候,你就需要一个输出log的地方,它在哪里…………
![](http://s3.51cto.com/wyfs02/M01/11/DB/wKioL1Lg2JLC0e21AALqo8ZqZRI975.jpg)
命令行窗口?这个可以有,好了,不多说,直接上代码
// 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如何?不过这个就太复杂了,下次再开专门主题讨论吧。
后记
这几天陆陆续续把调试篇写完了,需要能够帮到各位。有问题啥的,可以直接联系我,好了下次见。
相关文章推荐
- 【cocos2dx进阶】调试篇(2)Cocos2dx的一些小改造 推荐
- cocos2dx调试之cocos2dx的Log改造
- cocos2dx lua开发调试打log方式
- 【cocos2dx进阶】调试篇(1)基础介绍
- 利用可变参数,将调试信息写入文件log.txt中
- IE6789浏览器使用console.log类似的方法输出调试内容但又不影响页面正常运行
- 【COCOS2DX-LUA 脚本开发之十一】C/C++与Lua之间进行数据函数交互 推荐
- linux编程进阶书推荐APUE,UNP
- js 调试 console.dir() 和 console.log() 区别
- 推荐一篇调试Coded UI测试的文章
- 【已解决】 c8812在eclipse上调试打不出log来?求帮助如何解决?!!!
- 推荐一款安卓开发者无线调试用的APP Wi-ADB
- java进阶书籍推荐(不包括基础)
- 在android 输出log 信息 用于调试
- 推荐系统的循序进阶读物(从入门到精通)
- 我的Android进阶之旅------>经典的大牛博客推荐(排名不分先后)!!
- 基于VmWare的VxWorks BSP定制及调试环境构建方法 推荐
- 在android 输出log 信息 用于调试 .
- 华为手机调试程序不显示log信息
- 应用两个DLL文件在Keil环境下进行单片机开发调试仿真,强烈推荐给没有实验开发板的同学!!!!