场景:使用 cmakejs 运行 js 代码时,出现了闪退问题

分析:需要加载相关 pdb 文件,如何使用 vscode 调试 js 代码,可以参考: 使用 vscode 调试 nodejs 代码
从弹出上后,触发了 abort 导致运行中断,结合控制台给出的信息
D:\a\_work\1\s\src\vctools\crt\github\stl\src\mutex.cpp(64): mutex destroyed while busy
Request timeout.
Request timeout.
我们猜测是否与锁有关
那么如何查看崩溃的堆栈信息呢,首先,通过 RUN AND DEBUG
的 JS Debug Build
和 Windows Attach
依附到 native 的线程上
再点击弹出的重试按钮,因为弹窗也提示了重试后查看错误信息,最终发现了崩溃的代码行
问题代码:
std::unique_lock<std::mutex> lock(ctx->lock_);
while (!ctx->called_)
ctx->cv_.wait(lock);
delete ctx;
从这段代码可以看出,lock 还没被释放掉就调用 delete 了,从而出现了 mutex destroyed while busy
修改:
{
std::unique_lock<std::mutex> lock(ctx->lock_);
while (!ctx->called_)
ctx->cv_.wait(lock);
}
delete ctx;
小结:使用 vscode 调试底层代码不熟悉,导致花了不少时间来研究如何查看崩溃的堆栈信息,最终才找出问题所在