cocos2d-x 中android程序调试几种出错情况收集
2013-10-21 17:12
369 查看
1 stack corruption detected: aborted(Android NDK错误)
adb logcat错误 :堆栈错误,,或者访问过界。。。通常不太好调试。但是以下两种情况最最常见;
1 char aa[10];
strcpy(aa,"abcdefghijk123457890"); // 明显错误
2 char aa[6];
sprintf(aa,“the value is : %d”, 123);
尤其第二种情况比较隐藏。。。(转自jernymy的专栏)
2 onEnter没有被调用
首先说下onEnter()和init()的区别:onEnter()和init()这俩个方法都是CCNode的方法:
1.其被调用的顺序是先init(),后onEnter()。
2.init()在类的初始化时只会调用一次。
3.onEnter在该类被载入场景的时候被调用,可能会发生多次。
4.CCLayer* cclayer = new MyLayer();
这种情况下,只会触发onEnter。
5.CCLayer* cclayer = MyLayer::create();
这样情况下,既会触发init()方法,也会触发onEnter()方法。
因此,一般情况下,onEnter是拼写大意 出错了,如果还不行,可以在init里调用,
但也好像失去这个函数的意义了。(转自JiuJie_的专栏)
3 eclipse安装ADT插件重启后不显示Android SDK Manager和Android Virtual Device Manager图标的一种解决办法 :
在正确安装ADT插件重启后如果没找到想要的图标,请做如下操作:(检查是否正确安装的一种方式:打开Window——>Preferences属性,如果看到了名为Android的内容,就基本说明ok了)
打开 Eclipse ->window->costomize Perpective(定做透视图)->Command Groups Availability选项卡,勾选Android
SDK and AVD Manager复选框。
4 Adb connection Error:EOF Connection attempts: 1
出现这个问题首先看手机的设置:在手机应用程序->开发 选择usb调试 ,选择后看是否连接上,如果还是没有
那么在linux系统下可以这样操作:
如果出现上面的问题,而且有且只有Connection attempts: 1 ,这一条链接信息,目前的解决方法就是重启eclipse。
如果出现的是
[2011-07-27 10:31:48 - DeviceMonitor]Adb connection Error:EOF
[2011-07-27 10:31:48 - DeviceMonitor]Connection attempts: 1
[2011-07-27 10:31:49 - DeviceMonitor]Connection attempts: 2
[2011-07-27 10:31:50 - DeviceMonitor]Connection attempts: 3
[2011-07-27 10:31:51 - DeviceMonitor]Connection attempts: 4
[2011-07-27 10:31:52 - DeviceMonitor]Connection attempts: 5
[2011-07-27 10:31:53 - DeviceMonitor]Connection attempts: 6
[2011-07-27 10:31:54 - DeviceMonitor]Connection attempts: 7
[2011-07-27 10:31:55 - DeviceMonitor]Connection attempts: 8
[2011-07-27 10:31:56 - DeviceMonitor]Connection attempts: 9
[2011-07-27 10:31:57 - DeviceMonitor]Connection attempts: 10
[2011-07-27 10:31:58 - DeviceMonitor]Connection attempts: 11
解决方法可以是这样的
命令行下
tara@ubuntu:~$ adb kill-server
tara@ubuntu:~$ sudo adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *(很关键的信息,如果没有出现这样的提示,那就重新执行上面的命令)
List of devices attached
hw-smart-phone
device
5 storageManager' does not name a type
诸如此类的, 在一个类里面 明明包含了“storageManager”头文件, 却在编译是没有这样的类名。出错的原因:我找到的一种是出现了头文件的递归包含。所以请整理下你的#include 头文件, 不要乱包含。
6 Cocos2d: Assert failed: element type is wrong!
CCAnimation* animation = CCAnimation::create(animFrames, 0.09);可能是 CCAnimation *animation =
CCAnimation :: create (animFrames, 0.09 ); 出了问题!
直接用create方法,会进入initWithAnimationFrames方法,里面会检查传入的CCArray是否是CCAnimationFrame*类型,而显然,代码中CCArray中的元素是CCSpriteFrame*,所以出现了问题。
那么解决方法是:改用
CCAnimation *animation =CCAnimation ::createWithSpriteFrames (animFrames,0.09 );这个方法就可以了。
7
List of devices attached, ???????????? no permissions
lsusb查看一下USB设备Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 05c6:9031 Qualcomm, Inc.
发现我的可怜的小米,不在google销售商列表中
Bus 001 Device 004: ID 05c6:9031 Qualcomm, Inc.
按官网资料操作:
创建一个51-android.rules文件
sudo gedit /etc/udev/rules.d/51-android.rules
输入内容如下:
SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTRS{idProduct}=="9031", MODE="0666", GROUP="plugdev"
"05c6"和"9031"分别对应上面的"ID 05c6:9031".
然后进行授权操作:
sudo chmod a+r /etc/udev/rules.d/51-android.rules
现在adb devices仍然出现上述问题,需要重启udev
sudo service udev restart
然后重新拔插一下数据线.
现在再执行一下adb devices看看:
myUbuntu@ubuntu:~/Cocos2d/adt-bundle-linux-x86_64-20130729/sdk/platform-tools$ ./adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
a28b5902 unauthorized
(参考:Jieen的专栏)
8 OpenGL error 0x0500 in .... <qgl2DrvAPI_glBlendFuncSeparate:743>: GL_INVALID_ENUM
这个错误会一直刷log屏, 麻烦的很, 上网上查了查, 相关解决办法很少, 还有好些英文的, 没办法谁叫我是菜菜熊呢, 然后我就一点一点的排查, 终于找出 出现这个错误的其中一个原因, 说白了:就是因为自己太马虎了,看我代码:CCSprite* actSpBar = (CCSprite*) (this->getChildByTag(20005));
CCLabelAtlas* labelAtlas = (CCLabelAtlas*) (this->getChildByTag(20005));
在第二句语句前面已经有一个CCSpirte的tag为20005, 但我在查labelAtlas时, 却把它的tag:20006 误写成了 20005, 所以导致 tag为20005的sprite存在, 然后被强转成CCLabelAtlas, 如果再对labelAtlas 进行setString()时, 结果就会报这个错。
虽然我这个错误没一点技术含量, 但是还是告诉大家, 请先检查下拼写错误, 说不定就是因为自己一时手抖 结果就让自己忙活半天(仅此发发自己的牢骚)。
9 error: specialization of 'template<class _Tp> struct std::greater' in different namespace [-fpermissive]
这个问题其实在 使用 list排序时出现的情况,首先看下list排序的两个函数定义:/** * @brief Sort the elements. * * Sorts the elements of this list in NlogN time. Equivalent * elements remain in list order. */ void sort(); /** * @brief Sort the elements according to comparison function. * * Sorts the elements of this list in NlogN time. Equivalent * elements remain in list order. */ template<typename _StrictWeakOrdering> void sort(_StrictWeakOrdering);
sort();使用的是默认排序, 如果list 里存的元素类型是基本类型, 比如int,float什么的, 那么是有效的。如果里面存的是结构体,
那么我们就要用到第二个sort函数本身固有的重载方法sort(greater<>()),重载这个greater方法,例如:
struct Mt{ int m_id;// 编号 int m_attack;// 攻击 int m_defense;// 防御 }; template<> struct greater<Mt>:public binary_function<Mt, Mt, bool> { bool operator()(const Mt& x, const Mt& y) const { return x.m_id > y.m_id; } }; bool HelloWorld::init() { if (!CCLayer::init()) { return false; } Mt t1, t2, t3; t1.m_id = 1; t1.m_attack = 400; t1.m_defense = 200; t2.m_id = 2; t2.m_attack = 500; t2.m_defense = 100; t3.m_id = 3; t3.m_attack = 60; t3.m_defense = 500; list<Mt> listMt; listMt.push_back(t1); listMt.push_back(t2); listMt.push_back(t3); greater<Mt> gMt; listMt.sort(gMt); return true; }
其中return x.m_id > y.m_id; 可以换成结构体里的其他属性, 这样我们就可以对结构体的任何元素进行我们想要的排序, 然而我在编译的时候 出现了这个错误:
error: specialization of 'template<class _Tp> struct std::greater' in different namespace [-fpermissive]
error: from definition of 'template<class _Tp> struct std::greater' [-fpermissive]
经过上网上查找,我的解决办法是, 把greater重载函数也加上list.sort()头文件中的命名空间:
namespace std _GLIBCXX_VISIBILITY(default) { _GLIBCXX_BEGIN_NAMESPACE_VERSION template<> struct greater<Mt>:public binary_function<Mt, Mt, bool> { bool operator()(const Mt& x, const Mt& y) const { return x.m_attack > y.m_attack; } }; _GLIBCXX_END_NAMESPACE_CONTAINER }
注意:std 和 _GLIBCXX_VISIBILITY, 中间必须要有一个空格。
10 makefile:12: *** recipe commences before first target. Stop.mingw32-make
[1]:Leavingdirectory`c:/dev/GitHub/cocos2d-x/extensions/proj.emscripten's
解决办法:1、首先检查环境变量是否设置正确,比如说cygwin的环境变量。
2、隐藏性文字格式错误,文本文件中可能有隐藏用肉眼看不到的字符,直接退格再回车搞定, 尽量不要用记事本打开文件。
3、../../Classes/AppDelegate.cpp\
../../Classes/HelloWorldScene.cpp
像这样的, 两行之间 记得 加 '\',要不然也会包 *** recipe commences before first target. 这样的错
11 Android NDK: jni/Android.mk: Cannot find module with tag'CocosDenshion/android' in import path
Android NDK: Are you sure your NDK_MODULE_PATH variable is properly
defined ?
Android NDK: The following directories were searched:
Android NDK: jni/Android.mk:19: *** Android NDK: Aborting. . Stop.
解决方法:1、一种:右键工程项目->Properties->C/C++ Build->Environment,添加新的变量,点击 "Add...",
name:NDK_MODULE_PATH
value: F:\sangocraftMobile\branches\cocos2d-x2.1.4;F:\sangocraftMobile\branches\cocos2d-x2.1.4
\cocos2dx\platform\third_party\android\prebuilt (注:这里填写自己项目所在的引擎)
12 .exe不是有效的win32程序
这个问题是只真对个人 在把 vs2013上的.exe程序放到windowsXp上出现的错误.解决办法:
1. 更新VS
13 .cocos2dxActivity cannot be resolved to a type
1. 将cocos2d-x引擎的根目录的cocos2dx/platform/android/java/src文件夹下文件夹全部复制到项目的src包下即可。2. 导入cocos2dx/platform/android/java这个工程生成一个jar文件添加到项目的libs文件夹下即可, 这个方法没有试过.
相关文章推荐
- Cocos2d-x 3.2编译生成Android程序出错的解决方案
- Android_调试程序的几种方法
- cocos2d-x3.2中2编译生成Android程序出错的解决方案:c++_static报错
- Cocos2d-x 3.2编译生成Android程序出错Error running command, return code: 2的解决方法
- Android程序的调试-输出日志信息的几种方法
- Cocos2d-x 3.2编译生成Android程序出错的解决方案:c++_static报错
- Cocos2d-x 3.2编译生成Android程序出错的解决方案:c++_static报错
- 通过wifi调试android程序
- 如何在ADT中调试Android程序
- Android利用调试器调试程序
- eclipse下调试android程序问题
- Android eclipse中程序调试
- 程序执行析构函数的几种情况
- 3. 编写的第一个android HelloWorld程序如何在手机上面调试运行
- Android studio真机调试,小米手机安装程序失败
- 如何在Unity中对程序进行 Android 真机断点调试
- Android程序调试–LogCat按照日志信息级别进行输出和过滤
- 《Google Android开发入门与实战》5 ---- 创建、运行和调试Android程序
- Android linker可执行程序加载库失败时输出更详细调试信息
- 调试Android程序,不使用模拟器,无需数据线真机调试的方法