I'm trying to create a DataWriter for a custom topic and RTI is throwing an "Enable entity" exception. I rebuilt in debug and exception occurs on highlighted line:
dds::topic::Topic<UMAA::MM::ManageMissionPlan::MissionPlanReportType> topic(participant, "MissionPlanReportType Topic");
dds::pub::Publisher publisher(participant);
dds::pub::DataWriter<UMAA::MM::ManageMissionPlan::MissionPlanReportType> writer(publisher, topic);
Stack trace shows the following (below). retcode is DDS_RETCODE_ERROR(1). Debugger also shows an error popup: "Could not open "__cxa_throw" for reading. Either the file does not exist or you do not have permissions to open it."
Any ideas what might be causing this issue? Just before this I had a similar project working (just a different topic being published).
The full message should be printed in the console and included the exception what() method, which you can catch as a std::exception.
I'm capturing the full error, which is just "Enable entity":
try {
run_example(arguments.domain_id, arguments.sample_count);
} catch (const std::exception& ex) {
// This will catch DDS exceptions
std::cerr << "Exception in run_example(): " << ex.what()
<< std::endl;
return EXIT_FAILURE;
}
Debugger on the exception:
This line in TDataWriter appears to be the issue:
DataWriter(
const dds::pub::Publisher& pub,
const dds::topic::Topic<T>& the_topic)
: dds::core::TEntity<DELEGATE<T> >(new DELEGATE<T>(pub, the_topic))
{
this->delegate()->remember_reference(this->delegate());
}
Where delegate() is (Reference.hpp):
DELEGATE_REF_T& delegate() OMG_NOEXCEPT
{
return impl_;
}
The impl_ that gets returned looks valid on first glance. But the remember_reference() part doesn't work. I'm unable to step into it and see what's going on.
Potentially interesting note: If I step into this->delegate()->remember_reference(this->delegate()); the debugger appears to loop a lot on that line. Even if I hold down my Step Into shortcut key F11 it keeps looping over and and over. Then when I finally continue with F5 the exception throws.
I've also been reading into the "Could not open "__cxa_throw" for reading" error. One site mentioned incompatible compilers could have an impact. https://monoinfinito.wordpress.com/series/exception-handling-in-c/
I'm compiling my app with g++ 4.7.2 20121015. I could not find RTI libs with the same g++ version so I'm using x64Linux2.6gcc4.4.5. Despite the different g++ versions for the libs I've been able to create a DataWriter successfully for several other custom IDL topic types. So doesn't seem like different g++'s is the issue necessarily.
This is a failure in the DDS_Entity_enable() function, and could be due to multiple reasons. It should be printing the full error in the console.
You shouldn't need to open the source of __cxa_throw, that's just the low-level compiler-generated code that throws the exception and is totally unrelated to the error in DDS.
Alex
This topic IDL is unique from the previous ones (which published correctly) in that it contains a sequence<CustomType> field.
If I change CustomType to something else (like a string) the message starts to publish.
Inside CustomType is included a sequence<AnotherCustomType>. I'm wondering if this "sequence of sequences" pattern is crashing the DataWriter (original IDL contains a sequence of CustomType's, where each CustomType is a sequence of AnotherCustomType's).
I tried changing AnotherCustomType to something else (like a string), and the original topic still failed to publish. Having nested sequences appears to be a problem. Maybe related to this earlier post?
Root cause of this issue was having 3+ nested sequences (causes memory allocation errors). Temporary fix is hardcoding a maximum element count for each sequence (e.g. sequence<string,10>). I think the long term fix is setting a maximum sequence length in the DataWriter. Looking into this related documentation:
https://community.rti.com/examples/using-sequences
To illustrate: Publishing this topic worked:
MyTopic.idl
Foo.idl
Bar.idl
#include "Foo.idl"
struct MyTopic
{
sequence<Foo> fooStuff;
};
#include "Bar.idl"
struct Foo
{
sequence<Bar> barThings;
string parentText;
};
struct Bar
{
string stuff;
};
However adding a 3rd nested sequence in Bar.idl resulted in the exception:
MyTopic.idl
Foo.idl
Bar.idl
#include "Foo.idl"
struct MyTopic
{
sequence<Foo> fooStuff;
};
#include "Bar.idl"
struct Foo
{
sequence<Bar> barThings;
string parentText;
};
struct Bar
{
sequence<string> seq;
};
Related error snippet:
RTIOsapiHeap_allocateBufferAligned:!malloc size exceeds heap (4027158016 > 2147483647)
REDAFastBufferPool_growEmptyPoolEA: !allocate buffer of 4027158016 bytes
REDAFastBufferPool_newWithNotification:!create fast buffer pool buffers
PRESTypePluginDefaultEndpointData_createWriterPool:!create writer buffer pool
PRESPsService_enableLocalEndpointWithCursor:failed to attach endpoint to typePlugin
PRESPsService_enableLocalEndpoint:!enable local endpoint
DDSDataWriter_impl::createI:ERROR: Failed to auto-enable entity
create_datawriter error