首页 > 解决方案 > “~__vector_base()”在 Wasm 中运行时间过长并且出现中止错误。找不到错误

问题描述

我已经制作了一个程序来执行登录程序并且运行良好,但是当我返回并注意到一个动态分配的变量(一个对象)没有被删除时,我纠正了这个问题,发现我的程序非常慢,大约需要每一步 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;
}

buffer 是一个基本的 std::vector,但 std::vector.clear() 不包含在堆栈跟踪中,似乎不是问题。

我将 ~Buffer() 修改为一个空函数并运行另一个配置文件但是,这只会使它更加混乱。

在此处输入图像描述

这是 demanged 的​​堆栈跟踪。

_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;
}

标签: c++vectoremscriptenwebassembly

解决方案


我相信这可能是 emscripten 本身的错误。

如果我使用 -g0 和 -O0 编译,它会编译上面的错误但不更改任何代码,我可以使用 -g0 和 -O1 进行编译以使其编译正常。

如果我用 -g4 和 -O1 编译,它会编译上面的错误,但如果我用 -g2 和 -O1 编译,它会编译得很好,并且有足够的调试信息来满足我的喜好。

我正在使用版本 1.38.31

该解决方案对我有用,如果将来有人遇到此错误,请留下答案。


更新:它回来了,意识到我两次释放了同一个指针。该死的你含糊的 C++ 错误信息


推荐阅读