Hi,
I'm trying to create a simple node that listens to Gazebo transport messages and republishes them on ROS2.
When I try to run the client/node I get the following error (Backtrace at the end of the message)
*** stack smashing detected ***: <unknown> terminated
The reason I suspect Gazebo is that the stack smash only happens when I actually start the gz server. Also, while the backtrace points at the FastRTPS XML loading code, if I spin the ROS node and then start the gz server, it will crash after I start the server.
I've created the following stub code to test. If you remove the allocation of std::shared_ptr<gazeborealsensebridge> bridge it will not crash. This code will only crash if the gzserver is running.
#include <iostream>
#include <memory>
#include <rclcpp/rclcpp.hpp>
#include <sensor_msgs/msg/point_cloud2.hpp>
#include <gazebo/transport/transport.hh>
#include <gazebo/msgs/msgs.hh>
#include <gazebo/gazebo_client.hh>
class GazeboRealSenseBridge : public rclcpp::Node
{
public:
GazeboRealSenseBridge() : rclcpp::Node("gazebo_realsense_bridge")
{
publisher = this->create_publisher<sensor_msgs::msg::PointCloud2>("realsense_pointcloud");
}
private:
rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr publisher;
};
int main(int argc, char **argv)
{
rclcpp::init(argc, argv);
gazebo::client::setup(0, nullptr);
std::shared_ptr<GazeboRealSenseBridge> bridge = std::make_shared<GazeboRealSenseBridge>();
std::map<std::string, std::list<std::string> > messageTypesAndTopics = gazebo::transport::getAdvertisedTopics();
for(auto it = messageTypesAndTopics.begin(); it != messageTypesAndTopics.end(); it++)
{
for(auto topicIt = it->second.begin(); topicIt != it->second.end(); topicIt++)
{
std::cout << *topicIt << " (" << it->first << ")" << std::endl;
}
}
gazebo::client::shutdown();
// rclcpp::spin(bridge);
rclcpp::shutdown();
return 0;
}
Appendix - Backtrace
I think this backtrace is suspect, as it will show the same backtrace if you spin the ros node and start the server later. This code should not continuously run.
Thread 1 "gazebo-realsens" received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51 51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory. (gdb) bt
#0 __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1 0x00007ffff6178f5d in __GI_abort () at abort.c:90
#2 0x00007ffff61c128d in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff62e6a26 "*** %s
***: %s terminated\n") at ../sysdeps/posix/libc_fatal.c:181
#3 0x00007ffff6267811 in __GI___fortify_fail_abort (need_backtrace=need_backtrace@entry=false, msg=msg@entry=0x7ffff62e6a0e "stack smashing detected") at fortify_fail.c:33
#4 0x00007ffff62677d2 in __stack_chk_fail () at stack_chk_fail.c:29
#5 0x00007ffff38b4031 in eprosima::fastrtps::xmlparser::XMLParser::loadXML (filename=<error reading variable: Cannot create a lazy string with address 0x0, and a non-zero length.>, Python Exception <class 'TypeError'> expected string or bytes-like object: root=) at /home/rosbuild/ci_scripts/ws/src/eProsima/Fast-RTPS/src/cpp/xmlparser/XMLParser.cpp:228
#6 0x00007ffff38be3fc in eprosima::fastrtps::xmlparser::XMLProfileManager::loadXMLFile (filename=<error reading variable: Cannot create a lazy string with address 0x0, and a non-zero length.>) at /home/rosbuild/ci_scripts/ws/src/eProsima/Fast-RTPS/src/cpp/xmlparser/XMLProfileManager.cpp:105
#7 0x00007ffff38bee68 in eprosima::fastrtps::xmlparser::XMLProfileManager::loadDefaultXMLFile () at /home/rosbuild/ci_scripts/ws/src/eProsima/Fast-RTPS/src/cpp/xmlparser/XMLProfileManager.cpp:86
#8 0x00007ffff3814fcb in eprosima ...
(more)