“~__vector_base() ”在 Wasm 中有多余的 运行 时间以及中止错误。找不到错误
"~__vector_base() " having an excess run time in Wasm as well as an abort error. Cannot find the error
我已经编写了一个程序来执行登录过程并且运行良好,但是当我回去发现一个动态分配的变量(一个对象)没有被删除时,我更正了它并发现我的程序是非常慢,每一步大约需要 3 秒,而以前是即时的。
我在调试模式下编译,我注意到的第一件事是调用了所有 abort() 错误。
然后我在 chrome 工具中 运行 配置文件,给出了这个结果。
这是已删除的堆栈跟踪,
_WoWAuthHandler::handleServerData(WoWPacket*)
_WoWPacket::~WoWPacket()
_Packet::~Packet()
_Buffer::~Buffer()
_Buffer::clear()
这是 ~Buffer() 的代码(不是我的代码)
Buffer::~Buffer() {
clear();
}
缓冲区::清除()
void Buffer::clear() noexcept {
buffer.clear();
readOffset = 0;
writeOffset = 0;
}
缓冲区是一个基本的 std::vector,但 std::vector.clear() 未包含在堆栈跟踪中,似乎不是问题所在。
我将 ~Buffer() 修改为一个空函数和 运行 另一个配置文件但是,这只会让它变得更加混乱。
这是 demanded 堆栈跟踪。
_WoWAuthHandler::handleServerData(WoWPacket*)
_WoWPacket::~WoWPacket()
_Packet::~Packet()
_Buffer::~Buffer()
_std::__2::vector<unsigned char, std::__2::allocator<unsigned char> >::~vector()
_std::__2::__vector_base<unsigned char, std::__2::allocator<unsigned char> >::~__vector_base()
~Buffer() 不调用任何东西。
我可以控制这种巨大的延迟发生,但它涉及删除对第一个变量的删除调用。不是一个选项,因为该变量是动态创建的。
void Socket::serverToHandler(int dataptr, int len) {
uint8_t* dataraw = (uint8_t*)dataptr;
std::vector<uint8_t>* dataParsed = Socket::parsePacket(dataraw, len);
WoWPacket* dataReader = new WoWPacket(dataParsed);
wowHandler->handleServerData(dataReader);
delete dataReader;//If this is removed, the code runs without issue. However, it lags a huge amount with it.
delete dataraw;
delete dataParsed;
}
我认为这可能是 emscripten 本身的错误。
如果我用 -g0 和 -O0 编译它会出现上面的错误但是
在不更改任何代码的情况下,我可以使用 -g0 和 -O1 进行编译以使其编译正常。
如果我用 -g4 和 -O1 编译它会出现上面的错误,
但是如果我用 -g2 和 -O1 编译它会编译正常,并且有足够的调试信息来满足我的喜好。
我使用的是 1.38.31 版本
这个解决方案对我有用,如果以后有人遇到这个错误,只需留下答案。
更新:
它回来了,意识到我两次释放同一个指针。
该死的你模糊的 C++ 错误消息
我已经编写了一个程序来执行登录过程并且运行良好,但是当我回去发现一个动态分配的变量(一个对象)没有被删除时,我更正了它并发现我的程序是非常慢,每一步大约需要 3 秒,而以前是即时的。
我在调试模式下编译,我注意到的第一件事是调用了所有 abort() 错误。
然后我在 chrome 工具中 运行 配置文件,给出了这个结果。
这是已删除的堆栈跟踪,
_WoWAuthHandler::handleServerData(WoWPacket*)
_WoWPacket::~WoWPacket()
_Packet::~Packet()
_Buffer::~Buffer()
_Buffer::clear()
这是 ~Buffer() 的代码(不是我的代码)
Buffer::~Buffer() {
clear();
}
缓冲区::清除()
void Buffer::clear() noexcept {
buffer.clear();
readOffset = 0;
writeOffset = 0;
}
缓冲区是一个基本的 std::vector,但 std::vector.clear() 未包含在堆栈跟踪中,似乎不是问题所在。
我将 ~Buffer() 修改为一个空函数和 运行 另一个配置文件但是,这只会让它变得更加混乱。
这是 demanded 堆栈跟踪。
_WoWAuthHandler::handleServerData(WoWPacket*)
_WoWPacket::~WoWPacket()
_Packet::~Packet()
_Buffer::~Buffer()
_std::__2::vector<unsigned char, std::__2::allocator<unsigned char> >::~vector()
_std::__2::__vector_base<unsigned char, std::__2::allocator<unsigned char> >::~__vector_base()
~Buffer() 不调用任何东西。
我可以控制这种巨大的延迟发生,但它涉及删除对第一个变量的删除调用。不是一个选项,因为该变量是动态创建的。
void Socket::serverToHandler(int dataptr, int len) {
uint8_t* dataraw = (uint8_t*)dataptr;
std::vector<uint8_t>* dataParsed = Socket::parsePacket(dataraw, len);
WoWPacket* dataReader = new WoWPacket(dataParsed);
wowHandler->handleServerData(dataReader);
delete dataReader;//If this is removed, the code runs without issue. However, it lags a huge amount with it.
delete dataraw;
delete dataParsed;
}
我认为这可能是 emscripten 本身的错误。
如果我用 -g0 和 -O0 编译它会出现上面的错误但是 在不更改任何代码的情况下,我可以使用 -g0 和 -O1 进行编译以使其编译正常。
如果我用 -g4 和 -O1 编译它会出现上面的错误, 但是如果我用 -g2 和 -O1 编译它会编译正常,并且有足够的调试信息来满足我的喜好。
我使用的是 1.38.31 版本
这个解决方案对我有用,如果以后有人遇到这个错误,只需留下答案。
更新: 它回来了,意识到我两次释放同一个指针。 该死的你模糊的 C++ 错误消息