AVRO编码api在尝试编码字符串时崩溃



我是编程和AVRO的新手。所以,请原谅我。我正试图编码和解码AVRO格式的几个字符串。我遵循了APACHE AVRO CPP页面中提到的相同示例。参考:- https://avro.apache.org/docs/1.10.2/api/cpp/html/index.html .

这是我的JSON Schema。

{
"type": "record",
"name": "cpx",
"fields" : [
{"name": "re", "type": "string"},
{"name": "im", "type" : "string"}
]
}

这是我生成的头文件。

namespace c {
struct cpx {
std::string re;
std::string im;
cpx() :
re(std::string()),
im(std::string())
{ }
};
}
namespace avro {
template<> struct codec_traits<c::cpx> {
static void encode(Encoder& e, const c::cpx& v) {
avro::encode(e, v.re);
avro::encode(e, v.im);
}
static void decode(Decoder& d, c::cpx& v) {
if (avro::ResolvingDecoder *rd =
dynamic_cast<avro::ResolvingDecoder *>(&d)) {
const std::vector<size_t> fo = rd->fieldOrder();
for (std::vector<size_t>::const_iterator it = fo.begin();
it != fo.end(); ++it) {
switch (*it) {
case 0:
avro::decode(d, v.re);
break;
case 1:
avro::decode(d, v.im);
break;
default:
break;
}
}
} else {
avro::decode(d, v.re);
avro::decode(d, v.im);
}
}
};

}

这是我的CPP源文件。

#include <stdlib.h>
#include "bla.hh"
#include "avro/Encoder.hh"
#include "avro/Decoder.hh"

int main()
{
std::unique_ptr<avro::OutputStream> out = avro::memoryOutputStream();
avro::EncoderPtr e = avro::binaryEncoder();
e->init(*out);
c::cpx c1;
c1.re = "hello";
c1.im = "thanks";
avro::encode(*e, c1);
std::unique_ptr<avro::InputStream> in = avro::memoryInputStream(*out);
avro::DecoderPtr d = avro::binaryDecoder();
d->init(*in);
c::cpx c2;
avro::decode(*d, c2);
std::cout << '(' << c2.re << ", " << c2.im << ')' << std::endl;
std::cout << "DECODED" << std::endl;
return 0;
}

这是我如何编译二进制文件

c++ test.cpp -std=c++11 -lavrocpp

当我运行这个时,我遇到了一个崩溃,这是我的核心转储。

[root@2-9 bin_kw]# GDB ./a。/数据/存储/corefiles/core.a.out

[root@2-9 bin_kw]# gdb

./a.o ut/数据/存储/corefiles core.a.out.30222.2 com.1658156296——9.GNU gdb (gdb) Red Hat Enterprise Linux 7.6.1-115。版权所有(C)2013自由软件基金会,Inc。许可证GPLv3+: GNU GPL版本3或更新http://gnu.org/licenses/gpl.html这是免费软件:你可以自由地修改和重新发布它。没有保证,对法律允许的范围。输入"显示复制";并"显示保修"。为细节。这个GDB配置为"x86_64-redhat-linux-gnu"。为错误申报说明请参见:http://www.gnu.org/software/gdb/bugs/..。从/root/Nightly_Suite_Workspace/女士/CU_CP/bin_kw/a.o ut……(没有调试符号发现)…。[新的LWP 30222][线程调试使用。libthread_db enabled]使用主机libthread_db库"/lib64/libthread_db.so.1"。Core是由'./a.out'生成的。项目

以11号信号终止,分割故障。

#0 __memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy_ssse3 -back。S:896 896
movaps 0x37(%rsi), %xmm5警告:文件"/usr/地方/lib64/libstdc + + .so.6.0.21-gdb.py"自动加载被"自动加载安全路径"设置为拒绝"美元debugdir: $ datadir/自动负载:/usr/bin/mono-gdb.py"。要启用执行此文件添加在你的配置中添加-auto-load-safe-path/usr/local/lib64/libstdc++.so.6.0.21-gdb.py行文件"/根/.gdbinit"。要完全禁用此安全保护添加设置自动加载安全路径/line到你的配置文件"/root/.gdbinit"有关此安全保护的详细信息请参阅"自动加载安全路径"。章节。例如,运行从壳中:info &;(gdb)自动加载安全路径&;缺少单独的调试信息,请使用:debuginfo-install提高1.53.0 - 28. el7.x86_64——文件系统提高- iostream 1.53.0 - 28. - el7.x86_64提高-程序-选项- 1.53.0 el7.x86_64——28.提高1.53.0 - 28. el7——正则表达式。x86_64提高-系统- 1.53.0 28. el7.x86_64bzip2 1.0.6 - 13. el7——填词。x86_64 libicu - 50.2 - 3. - el7.x86_64

(gdb) bt

#0 __memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:896#1 0x00007f28e9dad9e1 in avro::BinaryEncoder::encodeString(std::string const&) () from/usr/local/lib/libavrocpp.so.1.11.0#2 0x0000000000401778在avro::codec_traits

::encode(avro::Encoder&, std::__cxx11::basic_stringconst&) ()#3 0x0000000000401a6e在void avro::encode::encode(avro::Encoder&, c::cpx const&) ()#5 0x0000000000401ddc在void avro:: encoder(avro::Encoder&, c::cpx const&) ()#6 0x00000000004014ac in main ()**

我想弄清楚,但我找不到任何线索。请帮助我,提前感谢。这就是我所指的那一页

我从链接中安装了库并构建了代码,大部分没有修改:

#include <string>
//#include "bla.hh"
#include "api/Compiler.hh"
#include "api/DataFile.hh"
#include "api/Decoder.hh"
#include "api/Encoder.hh"
#include "api/Generic.hh"
#include "api/Stream.hh"
namespace c {
struct cpx {
std::string re;
std::string im;
cpx() :
re(std::string()),
im(std::string())
{ }
};
}
namespace avro {
template<>
struct codec_traits<c::cpx>
{
static void encode(Encoder& e, const c::cpx& v)
{
avro::encode(e, v.re);
avro::encode(e, v.im);
}
static void decode(Decoder& d, c::cpx& v)
{
if(avro::ResolvingDecoder* rd =
dynamic_cast<avro::ResolvingDecoder*>(&d))
{
const std::vector<size_t> fo = rd->fieldOrder();
for(std::vector<size_t>::const_iterator it = fo.begin();
it != fo.end();
++it)
{
switch(*it)
{
case 0: avro::decode(d, v.re); break;
case 1: avro::decode(d, v.im); break;
default: break;
}
}
} else
{
avro::decode(d, v.re);
avro::decode(d, v.im);
}
}
};
} // namespace avro
#include <stdlib.h>
int main()
{
std::unique_ptr<avro::OutputStream> out =
avro::memoryOutputStream();
avro::EncoderPtr e = avro::binaryEncoder();
e->init(*out);
c::cpx c1;
c1.re = "hello";
c1.im = "thanks";
avro::encode(*e, c1);
std::unique_ptr<avro::InputStream> in =
avro::memoryInputStream(*out);
avro::DecoderPtr d = avro::binaryDecoder();
d->init(*in);
c::cpx c2;
avro::decode(*d, c2);
std::cout << '(' << c2.re << ", " << c2.im << ')' << std::endl;
std::cout << "DECODED" << std::endl;
return 0;
}

运行正常,打印

(hello, thanks)
DECODED

我甚至启用了-fsanitize=address,在整个项目中未定义(包括avro/lang/c++/CMakeLists.txt),它仍然运行得很干净。

你可以尝试静态链接:

g++ test.cpp -std=c++11 -lavrocpp_s

如果在构建时,您很可能会找到与运行时安装和找到的avrocpp不同的版本。您还可以通过使用

来验证这一点
ldd a.out

查看libavrocpp.so在运行时解析的共享库。

相关内容

  • 没有找到相关文章

最新更新