3.11 jsb + vscode 调试加断点问题

进入调试状态, 也连接上了,
但是加断点经常不起作用,加的断点提示未验证什么的

vscode有时候还会显示
cocos request failed (reason: no valid source specified xxx.js)

自己改了一下,好像比原来强点了
改了 NS_ProcessNextEvent和update 这两个函数

1赞

@minggo 麻烦看下这个

@phoenixdown 你的这个改动解决了什么问题?

原来的代码取得size后,就unlock了,在进入while前就可能在别的线程里g_quene的的size发生变化,比如变成0了
进入while后就会报错了
@minggo

然后今天断点又不好使了,但是不会C++那边不会报错了

但是在使用g_queue前有再次获取锁啊。不过你的做法是使得逻辑更清晰一些。

有报什么问题吗?

@minggo

再次获取锁的时候,g_quene已经空了

vscode有时候还会显示
cocos request failed (reason: no valid source specified xxx.js)

@minggo

断点不好使的问题找到了, 是我为了区分app和h5版本的main.js改了man.js的名字造成的,
cocos-debug的cocosFXDebug.js 里main.js的名字是固定的,
我在launch.json里加了个定义main名字的属性,算是解决了这个问题

C++端的那个g_quene的问题还是确实存在的。我按我的方法改了就没有问题了

从代码逻辑来看确实存在你说的情况。能否往github提交一个PR?

是的,目前只有main.js能够唯一定义路径问题。

void SimpleRunLoop::update(float dt)
{
    //g_qMutex.lock();
    //size_t size = g_queue.size();
    //g_qMutex.unlock();

	while (true)
    {
		std::string str = "";
        g_qMutex.lock();

		size_t size = g_queue.size();
		if (size > 0)
		{
			auto first = g_queue.begin();
			str = *first;
			g_queue.erase(first);
			size = g_queue.size();
		}
        g_qMutex.unlock();
        
		if (str.length() > 0)
		{
			ScriptingCore::getInstance()->debugProcessInput(str);
		}

		if (size <= 0)
			break;
    }
}

void ScriptingCore::debugProcessInput(const std::string& str)
{
    JSAutoCompartment ac(_cx, _debugGlobal.ref());
    
    JSString* jsstr = JS_NewStringCopyZ(_cx, str.c_str());
    jsval argv = STRING_TO_JSVAL(jsstr);
    JS::RootedValue outval(_cx);
    
    JS::RootedObject debugGlobal(_cx, _debugGlobal.ref());
    JS_CallFunctionName(_cx, debugGlobal, "processInput", JS::HandleValueArray::fromMarkedLocation(1, &argv), &outval);
}

static bool NS_ProcessNextEvent()
{
    //g_qMutex.lock();
    //size_t size = g_queue.size();
    //g_qMutex.unlock();
    
    while (true)
    {
		std::string str = "";
        g_qMutex.lock();
		size_t size = g_queue.size();
		if (size > 0) 
		{
			auto first = g_queue.begin();
			str = *first;
			g_queue.erase(first);
			size = g_queue.size();
		}
        g_qMutex.unlock();
        
		if (str.length() > 0)
		{
			ScriptingCore::getInstance()->debugProcessInput(str);
		}

		if (size <= 0)
			break;
    }
//    std::this_thread::yield();
    std::this_thread::sleep_for(std::chrono::milliseconds(10));
    
    return true;
}

就这两个函数,你们自己改吧

好的,我提交了修改:https://github.com/cocos2d/cocos2d-x/pull/15705
谢谢

@minggo

void SimpleRunLoop::update(float dt)
{
std::string message;
size_t messageCount = 0;
while (true)
{
g_qMutex.lock();
messageCount = g_queue.size(); // if messageCount == 1
if (messageCount > 0)
{
auto first = g_queue.begin();
message = *first; // get a message
g_queue.erase(first);
–messageCount; // messageCount = 0
}
g_qMutex.unlock();

    if (messageCount == 0)    // messageCount is 0 break
        break;
    
    if (!message.empty())      // message 还未处理
        ScriptingCore::getInstance()->debugProcessInput(message);
}

}

:+1: 提交修改了:https://github.com/cocos2d/cocos2d-x/pull/15731

最近我也遇到了