std :: system_error возникает в Protobuf ParseFromZeroCopyStream () - PullRequest
0 голосов
/ 04 июля 2019

Я тестирую protobuf со сжатием zlib.

Я написал пример кода на c ++ с использованием protobuf 3.8.0, но при вызове ParseFromZeroCopyStream() в Ubuntu произошла следующая ошибка.

terminate called after throwing an instance of 'std::system_error'
  what():  Unknown error -1
(core dumped)

что я могу сделать?

Я пытался заменить ParseFromZeroCopyStream() на ParseFromBoundedZeroCopyStream().Это приводит к отсутствию дампа памяти, но ParseFromBoundedZeroCopyStream() вернул false.

test.proto

syntax = "proto2";

package test;

message Msg
{
    required uint32 data = 1;
}

test.cc

#include <iostream>
#include <google/protobuf/io/zero_copy_stream_impl.h>
#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
#include <google/protobuf/io/gzip_stream.h>
#include "test.pb.h"

using namespace std;
using namespace google::protobuf;
using namespace test;

int main(void)
{
    Msg srcMsg; 
    srcMsg.set_data(1);

    long sSize = srcMsg.ByteSizeLong();
    cout << "SerializedSize = " << sSize << endl;

    char * compressedMsg = new char[sSize];
    io::ArrayOutputStream aos(compressedMsg, sSize); 
    io::GzipOutputStream gos(&aos);

    long cSize;
    if (srcMsg.SerializeToZeroCopyStream(&gos) == true)
    {
        gos.Close();
        cSize = aos.ByteCount();
        cout << "compression success : " << cSize << " bytes" << endl;
    }
    else    
    {
        cout << "compression error" << endl;
        return 1;
    }

    Msg targetMsg;

    io::ArrayInputStream ais(compressedMsg, cSize); 
    io::GzipInputStream gis(&ais);

    if (targetMsg.ParseFromZeroCopyStream(&gis) == false)
    {
        cout << "decompression error" << endl;
    }
    else    
    {
        cout << "decompression success : " << targetMsg.ByteSizeLong() << " bytes" << endl;
        cout << "data = " << targetMsg.data() << endl;
    }

    delete[] compressedMsg;

    return 0;
}

Я ожидаю, что декомпрессия будет успешной.

1 Ответ

0 голосов
/ 04 июля 2019

Вам нужно будет научиться использовать отладчик, чтобы дополнительно выяснить, почему именно эта «неизвестная ошибка: -1» выдается - если возможно.

При этом неизвестными ошибками библиотеки являются иногда , вызванные ошибочным выделением памяти или, в более редких случаях, некоторыми другими ограничениями ресурсов, такими как невозможность запустить поток / процесс и т. Д.

...