Hi all!
I use protobuf in my c++ app on Ubuntu 14.04 system. libprotobuf-dev,
libprotoc-dev packages has static linkage with app. Important to note that
this packages builded WITHOUT -DNDEBUG compiler flag (i.e. debug/test mode,
where GOOGLE_DCHECK macro on).
I have the next objects to working with protobuf:
class ExceptionMfec : public MultiFileErrorCollector
{
public
void AddError (const string &filename,
int line, int column,
const string &message)
{
const std::string errMesage =
//construct msg here
throw std::runtime_error (errMesage);
}
};
DiskSourceTree dst_;
ExceptionMfec mfec_;
Importer importer_ (&dst_, &mfec_);
Now if I run my app using .proto file with syntax error:
message Msg {
required int32 foo = 1;
}
some_garabage_here
I got correct error message like: "... Expected top-level statement
(e.g. "message")." But if .proto file has logic error like:
message Msg {
required nonexistent_type foo = 1;
}
Then I got core dump with following output:
terminate called after throwing an instance of 'std::runtime_error'
what(): CHECK failed: checkpoints_.empty():
Aborted (core dumped)
The core dump is:
#0 0x00007f9695476c37 in __GI_raise (sig=sig@entry=6) at
../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1 0x00007f969547a028 in __GI_abort () at abort.c:89
#2 0x00007f9695b6b535 in __gnu_cxx::__verbose_terminate_handler() () from
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00007f9695b696d6 in ?? () from
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4 0x00007f9695b68799 in ?? () from
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5 0x00007f9695b6934a in __gxx_personality_v0 () from
/usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6 0x00007f9695e12aa6 in __libunwind_Unwind_Resume () from
/usr/lib/x86_64-linux-gnu/libunwind.so.8
#7 0x0000000000b84193 in google::protobuf::compiler::Importer::~Importer()
()
Looks like protobuf invoke my AddError() function, then first exception was
thrown. Then another exception was generated inside ~Importer() which
declared as noexcept(true) and program terminated.
If what I have written above is true, then protobuf behavior is very
strange: exception from destructor is bad, exception from noexcept
destructor even worse.
Is there a workaround of this issue, in order to get correct error message?
***************************************************************************************************************************************************************************************
I also see another approach to avoid issue with core. I may build protobuf
package WITH -DNDEBUG, then GOOGLE_DCHECK macro off, and I'll get correct
error message without core.
But I need protobuf runtime checks like ckeck that 'required' fields is
present in serialized data, and other.
Can I check that required fields are present using some protobuf API?
Thanks in advance!
--
You received this message because you are subscribed to the Google Groups
"Protocol Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.