«~ __vector_base ()» имеет избыточное время выполнения в Wasm, а также ошибку отмены.Не могу найти ошибку - PullRequest
0 голосов
/ 22 сентября 2019

Я создал программу для выполнения процедуры входа в систему, и она прекрасно работала, но когда я вернулся и заметил, что динамически размещаемая переменная (объект) не удаляется, я исправил это и обнаружил, что моя программа работает очень медленнозанимает около 3 секунд за каждый шаг, когда он был ранее мгновенным.

Я скомпилировал в режиме отладки, и первым, что я заметил, были все вызываемые ошибки abort ().

enter image description here

Затем я запустил профиль в инструментах Chrome и дал такой результат.

enter image description here

Это трассировка стека,

_WoWAuthHandler::handleServerData(WoWPacket*)
   _WoWPacket::~WoWPacket()
      _Packet::~Packet()
         _Buffer::~Buffer()
            _Buffer::clear()

Это код для ~ Buffer () (Не мой код)

Buffer::~Buffer() {
     clear();
}

Buffer :: clear ()

void Buffer::clear() noexcept {
    buffer.clear();
    readOffset = 0;
    writeOffset = 0;
}

Буфер является базовым std :: vector, но std :: vector.clear () не включен втрассировка стека и, похоже, не является проблемой.

Я изменил ~ Buffer (), чтобы он был просто пустой функцией, и запустил другой профиль. Однако, это только запутало его.

enter image description here

Это трассировка стека для этого.

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

1 Ответ

0 голосов
/ 24 сентября 2019

Я полагаю, что это может быть ошибкой в ​​самом emscripten.

Если я скомпилирую с -g0 и -O0, это скомпилируется с ошибкой выше, но без изменения какого-либо кода, я могу скомпилировать с -g0 и-O1, чтобы он скомпилировался нормально.

Если я скомпилирую с -g4 и -O1, он скомпилируется с ошибкой, описанной выше, но если скомпилировать с -g2 и -O1, он скомпилируется нормально, идостаточно отладочной информации на мой вкус.

Я использую версию 1.38.31

Это решение работает для меня, просто оставив ответ, если у кого-нибудь появится эта ошибка в будущем.

...