0%

Segment-Fault-Debugging

When C++/Python/ROS Programs Encounter Segfaults Without Showing the Error Location: How to Quickly Locate the Bug?

Python Programs

When a Python program encounters a direct segfault, it’s likely due to an error in a C-written API. You can use Python’s built-in faulthandler module to display the exact location of the error.
Documentation: https://docs.python.org/3/library/faulthandler.html

C/C++ Programs (Including ROS)

  • Check if Core Dumps Are Allowed:
    • Run ulimit -c.
    • If it returns 0, it means core dumps are not allowed. Use ulimit -c unlimited to allow unlimited core dumps, then rerun the program.
  • Locate the Core Dump File:
    • On Ubuntu, core dump files are usually managed by the apport system.
    • The apport script (a Python 3 program) is located at /usr/share/apport/apport.
    • The apport log, which records the activities related to crash handling and report generation, can be found at /var/log/apport.log.
    • By checking the apport log, you can determine the location of the core dump file, typically found in /var/crash/ with names like _executable_path.crash.
  • Launch GDB:
    • Use the command gdb /path/to/executable /path/to/coredump to load the executable and core dump files.
    • For ROS1, the executable can be found in the workspace under devel/lib/<node_name>.
    • For ROS2, the executable will be in install/<node_name>.
  • Get the Stack Trace at the Time of the Crash:
    • Inside GDB, use bt or backtrace to get the function call stack. Usually, locating the part of the call stack that with your code will reveal the bug.
  • Select and Inspect Specific Frames:
    • Use frame <frame_number> to select an interesting stack frame.
    • Use info locals to inspect local variables within that frame.
    • Use list to view the surrounding source code.
  • Inspect and Print Variables:
    • Use print <variable_name> to check the value of specific variables.