Skip to content

Memory leakage caused by gz_transport_pybind11 #2825

@liyitao-code

Description

@liyitao-code

Environment

  • OS Version: Ubuntu 24.04
  • Source or binary build?
    Source build, use gz-sim9 version:d83d135
    Built with gcc version 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04)
    Build options: -DCMAKE_BUILD_TYPE=Coverage
    Use Valgrind to detect memory issues during runtime.

Description

  • Expected behavior: No memory issues occur.
  • Actual behavior: There are some memory issue.

Steps to reproduce

python3 random_fixture.py -v
random_fixture.txt

Output

This is the complete memory error report, which contains many errors. The main one I want to report is the 'define lost' error.valgrind.log
This is a simplified error report that only contains two key errors.definitely_lost_report.txt
It can be seen from the report that the memory leak seems to mainly occur in the _gz_transport_pybind11 file.

==1120172== 32 bytes in 1 blocks are definitely lost in loss record 3,340 of 7,769
==1120172==    at 0x4846FA3: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==1120172==    by 0x7767D79: New (arena.h:492)
==1120172==    by 0x7767D79: CreateMessageInternal<gz::msgs::Boolean> (arena.h:584)
==1120172==    by 0x7767D79: gz::msgs::Boolean* google::protobuf::Arena::CreateMaybeMessage<gz::msgs::Boolean>(google::protobuf::Arena*) (boolean.pb.cc:326)
==1120172==    by 0x77689B7: CreateMaybeMessage<gz::msgs::Boolean> (message_lite.h:425)
==1120172==    by 0x77689B7: gz::msgs::Boolean::New(google::protobuf::Arena*) const (boolean.pb.h:138)
==1120172==    by 0x8E0FE5B: New (message.h:249)
==1120172==    by 0x8E0FE5B: SetResponse (ReqHandler.hh:348)
==1120172==    by 0x8E0FE5B: bool gz::transport::v14::Node::Request<google::protobuf::Message, google::protobuf::Message>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, google::protobuf::Message const&, unsigned int const&, google::protobuf::Message&, bool&) (Node.hh:547)
==1120172==    by 0x8DF80EA: gz::transport::v14::Node::RequestRaw(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, bool&) (Node.cc:1141)
==1120172==    by 0xCFECED0: operator() (_gz_transport_pybind11.cc:227)
==1120172==    by 0xCFECED0: pybind11::tuple pybind11::detail::argument_loader<gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&>::call_impl<pybind11::tuple, gz::transport::python::pybind11_init__transport(pybind11::module_&)::{lambda(gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&)#1}&, 0ul, 1ul, 2ul, 3ul, 4ul, 5ul, pybind11::detail::void_type>(gz::transport::python::pybind11_init__transport(pybind11::module_&)::{lambda(gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&)#1}&, std::integer_sequence<unsigned long, 0ul, 1ul, 2ul, 3ul, 4ul, 5ul>, pybind11::detail::void_type&&) && [clone .isra.0] (cast.h:1480)
==1120172==    by 0xCFFA273: call<pybind11::tuple, pybind11::detail::void_type, gz::transport::python::pybind11_init__transport(pybind11::module_&)::<lambda(gz::transport::v14::Node&, const std::string&, const std::string&, const std::string&, const std::string&, unsigned int const&)>&> (cast.h:1449)
==1120172==    by 0xCFFA273: pybind11::cpp_function::initialize<gz::transport::python::pybind11_init__transport(pybind11::module_&)::{lambda(gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&)#1}, pybind11::tuple, gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, pybind11::name, pybind11::is_method, pybind11::sibling, pybind11::arg, pybind11::arg, pybind11::arg, pybind11::arg, pybind11::arg, char [68]>(gz::transport::python::pybind11_init__transport(pybind11::module_&)::{lambda(gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&)#1}&&, pybind11::tuple (*)(gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&), pybind11::name const&, pybind11::is_method const&, pybind11::sibling const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, char const (&) [68])::{lambda(pybind11::detail::function_call&)#1}::operator()(pybind11::detail::function_call&) const [clone .constprop.0] (pybind11.h:253)
==1120172==    by 0xCFFA334: pybind11::cpp_function::initialize<gz::transport::python::pybind11_init__transport(pybind11::module_&)::{lambda(gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&)#1}, pybind11::tuple, gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, pybind11::name, pybind11::is_method, pybind11::sibling, pybind11::arg, pybind11::arg, pybind11::arg, pybind11::arg, pybind11::arg, char [68]>(gz::transport::python::pybind11_init__transport(pybind11::module_&)::{lambda(gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&)#1}&&, pybind11::tuple (*)(gz::transport::v14::Node&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&), pybind11::name const&, pybind11::is_method const&, pybind11::sibling const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, pybind11::arg const&, char const (&) [68])::{lambda(pybind11::detail::function_call&)#1}::_FUN(pybind11::detail::function_call&) (pybind11.h:224)
==1120172==    by 0xD021822: pybind11::cpp_function::dispatcher(_object*, _object*, _object*) (pybind11.h:946)
==1120172==    by 0x5820FE: ??? (in /usr/bin/python3.12)
==1120172==    by 0x548EC4: _PyObject_MakeTpCall (in /usr/bin/python3.12)
==1120172==    by 0x5D74D8: _PyEval_EvalFrameDefault (in /usr/bin/python3.12)

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    Status

    Inbox

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions