之前在论坛上提出和题目相关的问题(下文会提及),但是得不到很好的解决,最后自己找到了一些办法,所以就分享一下。这片文章是我在CSDN的博客上编辑好复制过来的,不知道显示有没有问题,有问题可以看看原文。
这段时间把
cocos2d-x 3.4的一个测试工程编译到Android手机上时,总出现在C++层一些莫名的错误,所以想调试一下到底是哪里出了错,用的工具是
Eclipse+ADT+CDT,最后也没弄成功,就把问题贴在这:http://www.cocoachina.com/bbs/read.php?tid=294829&page=e&#ahttp://www.cocoachina.com/bbs/read.php?tid=294829&page=e&#a,如果有朋友用Eclipse调试成功的,请分享一下。没成功,就只能找其他方法了,终于在StackFlow上找到相关的信息:http://stackoverflow.com/questions/24334080/how-to-debug-cocos2d-x-3-native-code-on-android-devicehttp://stackoverflow.com/questions/24334080/how-to-debug-cocos2d-x-3-native-code-on-android-device,而且信息已经比较健全了,在贴的最后提问者Narek把自己的总结也贴出来了。提问这位仁兄也是蛮不容易,用超过20天来解决这个问题,可见cocos2d-x提供的技术文档也是不够完善的,我也得好好感谢里面的两位
Narek和
Vikas Patidar。好吧,闲话到这,我们来看看,用ndk-gdb工具怎么调试。
一、确保cocos编译环境没问题
1、这个cocos自身已经做得非常自动化,在cocos引擎文件夹下双击一个setup.py,设置好
ANDROID_SDK_ROOT,NDK_ROOT,ANT_ROOT基本就可以建立好编译环境,当然别忘了setup是用python来运行的。还用不懂就到网上找或者看cocos目录下的README.md文件。
2、这里最好把NDK路径加入到环境变量的系统路径(即Path环境变量中)。因为本文会频繁用到ndk-build和ndk-gdb.py(和ndk-gdb同个东西,但是也有点点区别,下文会提及)命令,把ndk路径加入到系统路径中也是为了好调取这两个命令
二、修改Android工程文件
这些操作都在proj.android文件进行1、
Jni文件夹下
Android.mk修改这不用说,把自己工程要编译的写上去。
2、确认自己Android调试机的系统版本,从而确认自己API代号,如Narek的贴中所说,调试机是Android 2.3.3,那么它的API代号就是android-10,我的机器是4.03,那么API就是android-15,这个代号可以从ADT的Andoird SDK Manager工具确认。得到这个值之后,修改一下project.properties文件,把里面的XXtarget=android-XXandroid.library.reference.1=…/cocos2d/cocos/platform/android/java修改成你的测试机的代号。修改这个还不够,还有一个地方就在
AndroidManifest.xml中:uses-sdkandroid:minSdkVersion=“9”/<uses-featureandroid:glEsVersion=“0x00020000” />把
minSdkVersion项也改成调试机代号,不然一会执行ndk-gdb.py就出现以下错误:ERROR: The device does not support theapplication’s targetted CPU ABIs!Device supports: armeabi-v7aarmeabiPackage supports: Android NDK: WARNING: APP_PLATFORM android-15 islarger than android:minSdkVersion 9 in ./AndroidManifest.xml这个项可以等你调试没啥问题了,把它设置回来。
三、编译和运行工程
1、打开Windows的cmd、或者Linux的shell,转到你
工程目录下2、编译工程,我这采取Narek的命令行,如果不懂cocos命令行的,参考http://blog.csdn.net/luyafei_89430/article/details/38442391http://blog.csdn.net/luyafei_89430/article/details/38442391cocos compile -p android -m debug --ndk-modeNDK_DEBUG=1看有没有编译成功,到我写完文章,都没有出错过,所以有出错疑问,可以先检查一下cocos的环境设置,再留到评论里探讨探讨
3、把工程运行到调试机上,也是Narek的命令行cocos run -p android -m debug
四、开始调试
1、打开Windows的cmd、或者Linux的shell,转到你工程目录的
proj.android下2、执行
ndk-gdb.py命令(如果提示命令不存在,那就是你NDK在系统路径(path)中没设好,请自行检查)
NOTE:Narek用的是
ndk-gdb命令,但是我后来(之前我一直也是用ndk-gdb)发现如果用ndk-gdb进入调试,会出现下方的错误:warning: unrecognized item"timeout" in “qSupported” responseIgnoring packet error, continuing…Ignoring packet error, continuing…Ignoring packet error, continuing…Ignoring packet error, continuing…查询了一下,说得用
ndk-gdb.py就没问题。当然如果所用环境都搭建好了,不会出错。但是这里ndk-gdb.py还有很多命令参数,会导致启动失败,所以我也就介绍自己由于命令参数没设好导致的失败。首先是
–adb参数,这个参数是指定adb命令的路径。因为真机调试需要用adb命令来连接手机,所以这个参数是必须的。如果你在系统路径中已经指定了他的路径,那这里不加入这个参数也可以。但如果出现以下错误,你就必须去指定你的adb位置或修改你的路径ERROR: The ‘adb’ tool is not in your path. 夀漀甀 can change your PATH variable, or use --adb= to point to a valid one.这个命令的路径一般是Android的sdk目录中的platform-tools下,我这边的指定如下(windows环境下):ndk-gdb.py–adb=E:\Android\sdk\platform-tools\adb.exe这个命令很常见,很多应用都有它的存在,就是要用它来连接手机,获取一些信息。
第二命令是
–nowait参数。因为缺少jdb调试命令,出现的错误为:ERROR: Failed to find jdb…you can use --nowait to disable jdb…but may miss early breakpoints.我们这里只要调试C++代码就可以,所以不用jdb,直接加上这个参数就可以了。不过有jdb的话,会有更多的信息。
第三个命令是
–force。有时候我们可能有两个调试窗口调试应用,但是调试值允许一个窗口操作,另外一个窗口就调试不了,那此时这个命令就器作用,强制结束另外一个窗口的调试,直接用当前窗口调试。反正这个命令就是强制结束相同应用的进程。出错信息为:ERROR: Another debug session running, Use–force to kill it.第四个命令是可选的,
–verbose,可以打印你工程的信息,调试信息,是非常有用的(之前说它没用,真亏待了它)。
第五个命令就是
–launch。launch指定了应用入口的Activity,比如cocos2dx-3.4版本入口Activity是org.cocos2dx.cpp.AppActivity(我之前写错了,不是指定包的名字,sorry)
第六个命令把我害得最苦的,
–start。先说说它的用法:这个命令是直接启动应用的命令,它自动帮你指定了入口的Activity。如果不在其目录下,启动不了。一般用这个命令就可以启动程序了,但是,我发现在cocos用着命令会发现一个奇怪的问题,必须指定入口Activity而且这个问题非常隐蔽,我也是用–verbose才看出问题(所以才说它有用)。我用这个命令一直出现以下的错误:Android NDK installation path: E:/Android/android-ndk-r10dUsing specific adb command: E:\Android\sdk\platform-tools\adb.exeADB version found: Android Debug Bridge version 1.0.32Using ADB flags:Using auto-detected project path: .Found package name: com.cocos.testABIs targetted by application: armeabiDevice API Level: 15Device CPU ABIs: armeabi-v7a armeabiCompatible device ABI: armeabiUsing gdb setup init: ./libs/armeabi/gdb.setupUsing toolchain prefix: E:/Android/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/windows/bin/arm-linux-androideabi-Using app out directory: ./obj/local/armeabiFound debuggable flag: trueFound device gdbserver: /data/data/com.cocos.test/lib/gdbserverFound data directory: '/data/data/com.cocos.test’Found first launchable activity: .org.cocos2dx.cpp.AppActivityLaunching activity: com.cocos.test/.org.cocos2dx.cpp.AppActivity## COMMAND: adb_cmd shell am start -D -n com.cocos.test/.org.cocos2dx.cpp.AppActivity## COMMAND: adb_cmd shell sleep 2.000000Found running PID: 0这。。。。,入口函数里面多了个点(Found first launchable activity: .org.cocos2dx.cpp.AppActivity)。我想爆粗口:@#¥%#。我不知道怎么解释这个问题。。,所以我在这必须指定入口Activity了其他的命令我也没一一去研究,毕竟可以达到调试目的就可以了。
最终我的命令就是(懒人可以复制修改):
ndk-gdb.py–adb=adb路径\adb.exe–force–nowait–verbose–launch=org.cocos2dx.cpp.AppActivity嬀/size]
NOTE
:这里一个错误(我没遇到过)要提一提。回到Narek的文章中,Narek执行了ndk-gdb后出现这样子的错误:Nareks-MacBook-Pro:jni Narek$ ndk-gdbjni/Android.mk:67: *** Android NDK: Aborting. . 匀琀漀瀀.ERROR: The device does not support the application’s targetted CPU ABIs! Device supports: 愀爀洀攀愀戀椀-v7a armeabi 倀愀挀欀愀最攀 supports: Android NDK:嬀/size]自己觉得这个有点像第二大点中没设置好工程文件的的API代号,这我也不敢断定,既然作者说了,那也写出来,好给有问题的人一点提示。但自己做了一些测过,但大部分资料来自他的原文。如果你在jni文件夹中执行(这个命令应该是显示你编译的平台):ndk-build DUMP_APP_ABI正常的话应该是出现你编译的平台名字,如armeabi但Narek就出现如下的错误Nareks-MacBook-Pro:jni Narek$ ndk-buildDUMP_APP_ABIAndroid NDK:/Users/Narek/NoorGames/Games/test2/proj.android/jni/Android.mk: Cannot findmodule with tag ‘.’ in import pathAndroid NDK: Are you sure yourNDK_MODULE_PATH variable is properly defined ?Android NDK: The following directories weresearched:Android NDK:/Users/Narek/NoorGames/Games/test2/proj.android/jni/Android.mk:67: *** AndroidNDK: Aborting. . Stop.由于Vikas Patidar建议Narek用ndk-build DUMP_APP_ABI打印平台信息,从而查出
NDK_MODULE_PATH没有设定,所以V就成N的救星。那么NDK_MODULE_PATH是在哪里?
如果执行第三大步的第2小步命令,当命令执行不久,就可以看到NDK_MODULE_PATH的设置了Runing command: compileBuilding mode: debugbuilding nativeNDK build mode: NDK_DEBUG=1The Selected NDK toolchain version was 4.8 !running:’/Users/Narek/NoorGames/android-ndk-r9d/ndk-build -C/Users/Narek/NoorGames/Games/test2/proj.android -j1NDK_MODULE_PATH=/Users/Narek/NoorGames/Games/test2/proj.android/…/cocos2d:/Users/Narek/NoorGames/Games/test2/proj.android/…/cocos2d/cocos:/Users/Narek/NoorGames/Games/test2/proj.android/…/cocos2d/external’
如果屏幕滚得太快,可以用键盘的pause(break)键来暂停,Enter可以继续这个变量可以以环境变量添加到编译选项里,也可以直接
添加到jni的Android.mk文件中,Narek把加到mk文件样板给贴出来了:NDK_MODULE_PATH :=(LOCAL_PATH)/../../../../cocosNDK_MODULE_PATH +=(LOCAL_PATH)/…/…/…/…/external当然这也
仅供参考,具体还得看你自己的工程的NDK_MODULE_PATH是怎样的。3、开始GDB只要出现
(gdb)字样,那么接下去的事就是看你gdb基础扎不扎实
五、注意和提醒
1、在这里提醒一下,Narek文中叫我们要注意两个文件夹是否存在这些文件:proj.android/libs/armeabi文件夹下:
gdb.setup,gdbserver, libcocos2dcpp.soproj.android/obj/local/armeabi(作者的路径是proj.android/jni/obj/local/armeabi,我的是这个):
app_process, gdb.setup, libc.so, linker第一个文件夹下的文件是在第三点第2步自动生成的,只要用了debug模式第二个文件夹好像是执行了ndk-gdb.py后自动生成的反正我这边这些文件都是自动生成的,但既然作者说了,大家也就检查一下。
2、这个方法应该都可以使用到cocos2d-x3.x的版本。调试教程应该差不多,如果哪里写错,请不吝赐教,同时顺便帮忙解决这两个问题:1、程序一开始就崩溃,有没有更好的调试方法(这个问题自己解决了,只要通过本文,应该可以直接用命令行启动程序,直接到程序的入口)2、有关于eclipse的调试方法吗?毕竟有界面的调试总比gdb调试直观多了
花了不少时间写这个东西,着实不容易,转载就请留个Mark吧:http://blog.csdn.net/atlanticevix/article/details/45028797http://blog.csdn.net/atlanticevix/article/details/45028797