EventsCBGExecutor segfaults when a timer is removed while its callback is running
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 35/100
Direzione di ricerca
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.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
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.
- Lingua principale
- C++
- Stelle
- 814
- Fork
- 572
- Merge medio
- 5g 3h
- PR unite (30g)
- 17
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di ros2/rclcpp
-
enhancement
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
Copy constructor exception leaks intra-process message allocationForse già presa @TinyGeek l’ha presa 1 giorno fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
I maintainer di solito rispondono entro 1 giorno
-
[Jazzy] action server registers clock jump callbacks without the clock mutex (heap corruption)Forse già presa Una pull request collegata a questa issue è aperta o già unita. Apertabug
Difficoltà 4/5 3-5 giorni Idoneità per principianti 44/100
I maintainer di solito rispondono entro 1 giorno
-
EventsCBGExecutor keeps queued events of removed nodes, component container segfaults on shutdownForse già presa @spurnvoj l’ha presa 7 giorni fa. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 18/100
I maintainer di solito rispondono entro 1 giorno
-
bug
Difficoltà 3/5 Mezza giornata Idoneità per principianti 52/100
ros2/rclcpp#3311 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 77/100
ros-navigation/navigation2#6648 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
[BUG] OTA Requestor accepts reserved provider endpoint 0xFFFFForse già presa @Chapoly1305 l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
project-chip/connectedhomeip#74742 ·
I maintainer di solito rispondono entro 1 giorno