EventsCBGExecutor segfaults when a timer is removed while its callback is running
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Start with timer_manager.hpp, especially the running timer's done callback and TimerQueue::remove_timer(); then read the shutdown path in events_cbg_executor.cpp. Reproduce with the linked gist and run the regression cases described in the issue. Done means callbacks can finish after timer removal or shutdown without a segfault, and the full rolling test suite passes.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Generated by Generative AI
Root-cause analysis, reproducer and text drafting with help of Claude Code (claude-opus-5-5)
Operating System:
Ubuntu 24.04 x86_64; rolling checked in the ros:rolling container.
ROS version or commit hash:
Jazzy: rclcpp 28.1.22 (binary packages); origin/jazzy 53fa7aee has the same code. Rolling: rclcpp 33.1.0 (binary packages); origin/rolling afe12bfa has the same code.
RMW implementation (if applicable):
rmw_fastrtps_cpp (default). Originally seen with rmw_zenoh_cpp; the bug isn't RMW-related.
RMW Configuration (if applicable):
No response
Client library (if applicable):
rclcpp
'ros2 doctor --report' output
No response
Steps to reproduce issue
- Gist: https://gist.github.com/spurnvoj/bd80f243880fe569a155421f7297ea3d
- git clone into ws/src, colcon build, bash src/cbg_timer_removal_repro/run.sh 10
- Setup: one node with a 1 s timer callback in EventsCBGExecutor; the timer is removed while that callback runs. Three modes:
- remove_node: executor.remove_node(), no shutdown
- sigint: Ctrl-C during spin()
- sigint_spin_some: Ctrl-C during a spin_some() loop
Expected behavior
The callback finishes, the removed timer isn't re-armed, and the process exits normally.
Actual behavior
SIGSEGV right after the callback returns, in all 3 modes, every run: Jazzy 10/10, rolling 5/5.
#0 rcl_timer_get_next_call_time () from /opt/ros/jazzy/lib/librcl.so
#1 ?? () from /opt/ros/jazzy/lib/librclcpp.so
#2 std::_Function_handler<void (), rclcpp::executors::cbg_executor::TimerQueue::get_ready_timer_callbacks()::{lambda()#1}>::_M_invoke(...) from /opt/ros/jazzy/lib/librclcpp.so
#3 ... ReadyEntity::get_execute_function() ... from /opt/ros/jazzy/lib/librclcpp.so
#4 rclcpp::executors::EventsCBGExecutor::run(unsigned long, bool) () from /opt/ros/jazzy/lib/librclcpp.so
Additional information
- Cause, timer_manager.hpp (jazzy 53fa7aee):
- the done callback of a running timer keeps a raw
TimerData *andthis(l. 388-396); TimerQueue::remove_timer()erases theunique_ptr<TimerData>(l. 218). That happens on node removal and inEventsCBGExecutor::shutdown(), which also destroys the wholetimer_manager(events_cbg_executor.cppl. 142, 159);- when the callback returns,
add_timer_to_running_map()uses the freed data; - the comment at l. 391-394 says the data stays valid; that holds only against
remove_if_dropped(), not againstremove_timer().
- the done callback of a running timer keeps a raw
- Ctrl-C path: the shutdown guard condition's handler runs synchronously on the thread calling
rclcpp::shutdown()(the signal handler thread). So shutdown frees state while worker threads are still running callbacks. Thetimer_manager.reset()comment, "no thread is working on it any more", doesn't hold. - Also reachable without shutdown: unloading a component (
ComponentManager→remove_node) while one of its timers runs. - Real-world impact:
component_container_events_cbgsegfaults on Ctrl-C when a timer callback is in flight. Found in the MRS UAV system (multi-component containers). - Related but different bugs: #3312 / #3313 (queued events of removed nodes outlive the unloaded library), #3186 (double removal on shutdown).
- Fix ready: https://github.com/fly4future/rclcpp/tree/fix/events-cbg-timer-removal (PR to follow):
- internal to the source files only, no ABI change, backportable to Jazzy;
- regression test with 3 cases: unfixed rolling 10/10 segfault per case, fixed 10/10 pass;
- full rolling test suite passes.
- Lenguaje dominante
- C++
- Estrellas
- 815
- Forks
- 572
- Merge medio
- 6 d 8 h
- PR fusionados (30 d)
- 20
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de ros2/rclcpp
-
enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día
-
EventsCBGExecutor timers on ROS time stall after a backward /clock jumpPosiblemente ocupada @Yadunund la tomó hace 4 días. Abiertobug
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
Los mantenedores suelen responder en 1 día
-
Late /clock delivery under use_sim_time stalls node now() for ~0.33 s (found via ros2_control controller time)Posiblemente ocupada @JeremiahM37 la tomó hace 3 días. Abierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 10/100
ros2/rclcpp#3329 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
:farmer: Flaky EventsCBGExecutor test: reentrant callback group fails to run callbacks concurrentlyAbiertobug
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
-
Copy constructor exception leaks intra-process message allocationPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
Todos los issues de ros2/rclcpp
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 83/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
-
[BUG] Clipboard History: Buffer over-read in WideCharToMultiByte on double-click pastePosiblemente ocupada @softmgr la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
notepad-plus-plus/notepad-plus-plus#18519 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
justcallmekoko/ESP32Marauder#1635 ·
Los mantenedores suelen responder en 1 día
-
3.7.6-dev commit 80481ea - files not centered when resolution differs and zoom = "pixel-to-pixel"Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
grizzlypeak3d/DJV#931 ·