Repository navigation
【开发日志】第十七周(2025.07.10) #33
Irissssaa
announced in
Announcements
Replies: 0 comments
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.
工作内容
1. 完善获取异步函数调用栈的功能
思路:用返回值类型获取更完整的 poll 函数和闭包列表,future 白名单功能
**背景:**之前我们采用关键词过滤的方法从符号表中获得poll函数列表,然后使用 GDB 在这些函数上插桩,来获取异步函数调用栈;
遇到的问题:
思路动机:
core::task::poll::Poll类型;core::task::poll::Poll的情况,因为这么做没有意义,就算真有这种情况我们也可以用白名单过滤掉;实现(简单来说就是利用GDB的类型解析功能去获取到完整的poll函数和闭包)
note:本质上这里所说的poll函数、闭包都属于poll函数,区分他们的原因是闭包future隐藏实现细节,生成匿名结构,和前者有区别,后面会具体提到。
用GDB解析符号表,列出所有函数;
用GDB的类型解析功能解析出这些函数的返回值;
过滤出返回值是
core::task::poll::Poll类型的函数(包括poll函数和闭包);从白名单中过滤出需要跟踪的poll函数;
解析这些函数对应的future。考虑到future trait的定义一定是
trait future里面一定有poll方法,解析方法是:函数名字一定是::为分割,删除最后一个元素。(note:原本打算在这些函数触发时,解析他们的self参数,由于self参数指向这个poll函数对应的future,这样获得的future名一定是最准确的,但是由于以下原因放弃了这个做法:
a. 闭包没有self这个参数,只有_task_context 变量;
b. 在调试前获取不到这些信息,导致无法实现白名单功能;)
在之前解析出的future依赖图中(注意是 future 类型的依赖关系,不是 future 变量的依赖关系),查找出和这个future有关联的所有future;
反过来解析出关联future对应的poll函数,对这些函数进行插桩,从而获得future的调用栈
(疑问:运行时调用深层poll函数之前一定会调用浅层poll吗?还是说运行时可以在不调用浅层poll的情况下调用深层poll?这两种情况对应不同的调用栈生成方法)
All reactions