creator3.6 android端 window.console.error捕捉不到JS/TS层报错是怎么回事

如题 ,想接入BUGLY, 结果bugly只支持cocos2dx,对creator3.x不支持,只能自己手动监听JS层报错,看网上一大堆教程说要注册一个window.console.error = function() {}来监听,还信誓旦旦地说没问题绝对能捕捉到,然后我在游戏里手写一个空结点,取active值让它一定报错,但是网页端能捕捉到没问题,而android我用远程调试功能发现死活也触发不了报错捕捉,最多偶而一些websocket is error这种无关紧要的报错它捕捉到了,而JS报错它是绝对捕捉不了,
网上csdn上有一篇cocoscreator 3.7.2接入Bugly里面说找到引擎的 ProgramData\editors\3.7.2\resources\resources\3d\engine\native\cocos\application下 修改CocosApplication.cpp文件的 CocosApplication::handleException方法,在这里监听出错函数,结果我下断点测试发现同样无效,报错了根本毫无反应,
请问各位大神们,这该怎么办?为啥我命这么苦好不容易千辛万苦找到一个解决方案总是出现这样那样的问题

重写Game.cpp的handleException

void Game::handleException(const char *location, const char *message, const char *stack) {
    // Send exception information to server like Tencent Bugly.
    CC_LOG_ERROR("\nUncaught Exception:\n - location :  %s\n - msg : %s\n - detail : \n      %s\n", location, message, stack);
#if (CC_PLATFORM == CC_PLATFORM_ANDROID)
    /**
     * 5是JS错误的标志,Bugly定义的,参考com.tencent.bugly.BuglyStrategy。
     * JSError: 错误的名字,自定义是可以的,Bugly是这么定义的。
     * message: 错误的原因
     * stack: 错误的堆栈
     */
    cc::JniHelper::callStaticVoidMethod(BUGLY_CLZ_NAME, METHOD_POST_EXCEPTION, CATEGORY_JS_EXCEPTION, "JSError", message, stack);
#elif(CC_PLATFORM == CC_PLATFORM_IOS)
    CrashReport::reportException(message, stack);
#endif
}

然后release打包测试,

4赞

好的,谢谢大神,请问Game.cpp文件路径在哪啊

native/engine/common/Classes/Game.cpp

成功了,我之前一直在手机连着android studio debug模式调试,进不了这个handleException方法,换成release打包果然上报成功了,谢谢美女大神! :grinning:

其实我是男的 头像是我很多年前就喜欢的一位韩国女歌手 唱歌特别好听

https://forum.cocos.org/t/topic/152207/535?u=549238286
请问这样写后打包安卓报错是为啥啊?

容我先看看

#include “platform/java/jni/JniHelper.h”
这边这样导入构建就正常了,麻烦了,谢谢

cc::JniHelper::callStaticVoidMethod 是依赖于 "platform/java/jni/JniHelper.h" 的, 我把完整的Game.h也贴一下

#pragma once

#ifndef CATEGORY_JS_EXCEPTION
#define CATEGORY_JS_EXCEPTION 5
#endif

#include "cocos/cocos.h"

#if(CC_PLATFORM == CC_PLATFORM_ANDROID)
#define BUGLY_CLZ_NAME "cc/xxx/common/crashreport/CrashReportModule"
#define METHOD_POST_EXCEPTION "postException"
#include "platform/java/jni/JniHelper.h"
#elif(CC_PLATFORM == CC_PLATFORM_IOS)
#include "CrashReport.h"
#endif

/**
 @brief    The cocos2d Application.

 The reason for implement as private inheritance is to hide some interface call
 by Director.
 */
class Game : public cc::BaseGame {
public:
  Game();
  int init() override;
  // bool init() override;
  void onPause() override;
  void onResume() override;
  void onClose() override;
  void handleException(const char *location, const char *message, const char *stack) override;
};

1赞

请问如果handleException正常执行的话在as端应该会打印
CC_LOG_ERROR("\nUncaught Exception:\n - location : %s\n - msg : %s\n - detail : \n %s\n", location, message, stack);
这一条吧?不过这边写了测试好像as端没有打印这条信息 :joy:

只有release包才行的 debug包貌似引擎自己处理了 不走handleException

是release包,as打印了错误但没有走到handleException,这有办法排查原因吗?

我再看看3.8的文档 难道3.8的改了?

mark。
这个js监听报错的,能在js层监听么?
还是只能在c++层。

我看了看3.8的应该也一样的

这是我这边Game.cpp的代码,这边在测试是不是debugerInfo的问题所以强制设置了,其他地方应该没问题吧?

#include “Game.h”

#ifndef GAME_NAME

#define GAME_NAME “CocosGame”;

#endif

#ifndef SCRIPT_XXTEAKEY

#define SCRIPT_XXTEAKEY “”;

#endif

Game::Game() = default;

int Game::init(){

_windowInfo.title = GAME_NAME;

// configurate window size

// _windowInfo.height = 600;

// _windowInfo.width  = 800;

// #if CC_DEBUG

//     _debuggerInfo.enabled = true;

// #else

// #endif

_debuggerInfo.enabled = false;

_debuggerInfo.port = 6086;

_debuggerInfo.address = "0.0.0.0";

_debuggerInfo.pauseOnStart = false;

_xxteaKey = SCRIPT_XXTEAKEY;

BaseGame::init();

return 0;

}

void Game::onPause(){

BaseGame::onPause();

}

void Game::onResume(){

BaseGame::onResume();

}

void Game::onClose(){

BaseGame::onClose();

}

void Game::handleException(const char *location, const char *message, const char *stack){

// Send exception information to server like Tencent Bugly.

CC_LOG_ERROR("\nUncaught Exception:\n - location :  %s\n - msg : %s\n - detail : \n      %s\n", location, message, stack);

#if (CC_PLATFORM == CC_PLATFORM_ANDROID)

    /**

     * 5是JS错误的标志,Bugly定义的,参考com.tencent.bugly.BuglyStrategy。

     * JSError: 错误的名字,自定义是可以的,Bugly是这么定义的。

     * message: 错误的原因

     * stack: 错误的堆栈

     */

    cc::JniHelper::callStaticVoidMethod("com/cocos/sdk/SDKMgr", "postException", 5, "JSError", message, stack);

#elif (CC_PLATFORM == CC_PLATFORM_IOS)

CrashReport::reportException(message, stack);

#endif

}

CC_REGISTER_APPLICATION(Game);

看着没啥问题啊 :joy:

你是点击一个按钮后模拟的报错吗

对的,也测试了在onLoad里边报错,都没有执行