Python 3.9.3 をビルドして動作を見てみる。
# -*- coding: utf-8 -*- import os if __name__ == "__main__": os.system("ls")
みたいなスクリプトを書いて test.py
として保存しておく。
ビルドした Python 3.9.3 に対し、https://github.com/python/cpython/blob/v3.9.3/Modules/posixmodule.c#L4717 が os.system
の実装でしょうと当たりをつけておいて、
$ gdb --args ./python test.py ... (gdb) b Modules/posixmodule.c:4746 Breakpoint 1 at 0x191010: file ./Modules/posixmodule.c, line 4746. (gdb) r
でブレークポイントを設置して実行。
Breakpoint 1, os_system_impl (module=<optimized out>, command=0x7f8e7a1066f0) at ./Modules/posixmodule.c:4747 4747 const char *bytes = PyBytes_AsString(command); (gdb) n 4749 if (PySys_Audit("os.system", "(O)", command) < 0) { (gdb) p bytes $2 = 0x7f8e7a106710 "ls"
となることから、スクリプト側で渡した引数 ls
が os_system_impl
にまで渡ってきていることが分かった。