Repository navigation
测试总结 1 #38
Irissssaa
announced in
Announcements
测试总结 1
#38
Replies: 1 comment
|
补充总结中最后一个想法不正确:
|
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
测试总结
以下测试总结:
总的来说,我们工具的能力边界可以用一句话来概括:
下面是详细的分类:
✅ 可以成功追踪的
poll函数覆盖了绝大多数日常的
async/await用法。async fnasync fn standard_async_fn() -> i32 { ... }{async_fn#0}(poll 函数) 和{async_fn_env#0}(Future 状态机) 这种清晰、可预测的“兄弟节点” DWARF 结构。我们的脚本正是为此设计的。async块async { ... }async fn类似,编译器会生成{async_block#0}和{async_block_env#0}的兄弟节点,同样能被我们的脚本正确识别和关联。nested_async_fn中await了standard_async_fn和async_block。start-async-debug的第 3 步) 是这个工具的核心优势。只要起点是一个可追踪的 Future,它就能利用async_dependencies.json这份“地图”,自动找到并插桩整个调用链上的所有可追踪的poll函数。async fngeneric_async_fn<T>(...),lifetime_async_fn<'a>(...)...<i32>),并不会改变poll/Future兄弟节点的底层 DWARF 结构。我们的脚本能够正确处理这些名称。impl块中的async fnimpl MyStruct { async fn impl_async_fn(&self) { ... } }async fn同样遵循标准的编译器生成模式,会产生可预测的{impl#...}命名空间,并在其下生成可被关联的poll函数和Future结构体。❌ 无法 成功追踪的
poll函数这些情况暴露了工具的设计边界。
手动实现的
Future(impl Future for ...)impl Future for ManualFuture { fn poll(...) }poll函数是Future结构体的“孙子”节点,而非“兄弟”。poll函数就叫poll,Future结构体是自定义名ManualFuture,两者名字之间没有程序化的关联。我们为解决此问题而设计的“self参数分析”法也因 DWARF 结构过于复杂而失败。返回
Box<dyn Future>的函数fn boxed_future() -> Pin<Box<dyn Future<...>>> { ... }dyn Future这个 Trait 对象向外界隐藏了内部async块的具体类型。poll函数和Future状态机之间的“兄弟”关联被打破或变得不可预测,我们的脚本无法再将它们稳定地链接起来。使用了
#[async_trait]的函数#[async_trait] async fn my_method() { ... }Box<dyn Future>完全相同。#[async_trait]宏的本质就是将async fn自动重写成一个返回Pin<Box<dyn Future<...>>>的普通函数,因此它继承了类型擦除带来的所有问题。被完全内联优化的
async fncombinators_async_fn。async函数的逻辑过于简单,从不真正挂起(即从不返回Poll::Pending),编译器可能会将其整个函数体“内联”到调用处。poll函数虽然存在于符号表中,但没有任何call指令会去调用它,因此设置在它上面的断点永远不会被触发。补充总结:
All reactions