由于项目的原因我想看看Python中print
一类的函数的执行过程,试过单步调试的方法,但太过繁琐,因为对源码不熟悉还可能错过本该跟踪进去的函数,导致始终无法很清晰的看到整个流程。在网上搜索了一下发现,gdb调试器中可以捕获系统调用并打印当前的调用栈,这给了我新的启发。
我们在Ubuntu中实验一下。
输入以下命令启动调试器。
启动调试器随后捕获系统调用write
。
然后输入run
运行程序。
可以看到,gdb捕获了一个write
系统调用。接着使用bt
或者backtrace
命令查看当前的调用栈。
打印出的信息非常多,我们可以看到一些熟悉的函数。比如builtin_print()
,这是print
函数的C语言实现,在bltinmodule.c
中。
在经历了一系列步骤之后,最后调用了Py_write_impl()
函数,在fileutils.c
中,这就应该是调用系统调用的地方了。
果然,我们找到了系统调用的位置。
用这种方法观察就非常快了,还可以忽略到中间一些无关紧要的用于封装的函数,提升了效率。
网友评论