srs.py调试脚本介绍—SRS对StateThreads的改进与完善
作者:罗上文,微信:Loken1,公众号:FFmpeg弦外之音
前面《如何查看协程相关信息》,已经介绍了如何查看协程数量,遍历协程,通过 EBP 寄存器去查看协程的函数调用层级。不过这样手敲命令,还是比较麻烦。有没一种更自动化一点的方法呢?
答:有,就是 srs.py 脚本,这是一个 python 写的脚本,主要是调 GDB 的 API 完成一些功能,所以这个脚本只能在 GDB 窗口里运行,千万不要用 python 命令直接运行这个脚本,没用的。
我们把 srs.py 脚本下载下来,然后放到 st-1.9
目录里,如下:
然后我们就能在 clion 的 GDB 窗口用 source
命令导入这个 srs.py
脚本,如下:
source srs.py
当 srs.py
脚本 导入之后,就给 gdb 创建了两个新的命令,nn_coroutines
与 show_coroutines
。
1,nn_coroutines
打印协程的地址以及总数量
nn_coroutines
命令是打印协程的地址以及总数量,因为协程可能很多,所以默认是相隔 1000 条才打印一次 协程地址,所以如果你有 2000 个协程,他默认只会打印第 1 个,第 1000 个,第 2000 个 协程的地址。
如果你希望全部打印,可以给 nn_coroutines
传参数 1,这个参数如果不传,默认是 1000
nn_coroutines 1
其实他这里打印的不是 协程本身的地址,而是里面的 tlink
字段的地址。你可以用《如何查看协程相关信息》介绍的方法,修改 srs.py
,用偏移获取到 协程的地址再打印。
2,show_coroutines
显示协程的函数调用
show_coroutines
命令只显示了倒数第二层的函数调用,如下:
这个命令我觉得还可以继续优化一下,因为大部分的协程,他肯定是阻塞在切换协程哪里的函数的,所以看起来几乎是一样的,通过地址看不出来这是什么协程。
我个人觉得最好显示倒数 3 层的函数出来,会更容易阅读一些。读者可以自行修改 srs.py
来实现这个功能。
参考资料:
1,https://github.com/ossrs/state-threads/issues/15