您的位置:首页 > 移动开发 > Cocos引擎

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文件夹下即可, 这个方法没有试过.




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息