らんだむな記憶

blogというものを体験してみようか!的なー

Python の関数コール (2)

Python の関数コール - らんだむな記憶 の続き。

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#L4717os.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"

となることから、スクリプト側で渡した引数 lsos_system_impl にまで渡ってきていることが分かった。