URL: https://linuxfr.org/users/serge_ss_paille/journaux/debug-de-code-python-embarque-dans-du-code-c Title: Debug de code Python embarqué dans du code C++ Authors: serge_sans_paille Date: 2020年09月30日T19:22:30+02:00 License: CC By-SA Tags: c, python, gdb et langage_c Score: 35 Demat' iNal, On m'a posé tantôt une question assez intrigante au premier abord :> Dans une application native qui embarque un interpréteur Python, et que l'on est en train de déboguer avec ``gdb``, comment faire pour débogguer le code Python associé ? Pour donner un peu de contexte, on peut lire [la doc Python](https://docs.python.org/3/extending/embedding.html) et en extraire ce petit code C: ```c #define PY_SSIZE_T_CLEAN #include int main(int argc, char *argv[]) { wchar_t *program = Py_DecodeLocale(argv[0], NULL); if (program == NULL) { fprintf(stderr, "Fatal error: cannot decode argv[0]\n"); exit(1); } Py_SetProgramName(program); /* optional but recommended */ Py_Initialize(); PyRun_SimpleString("from time import time,ctime\n" "print('Today is', ctime(time()))\n"); if (Py_FinalizeEx() < 0) { exit(120); } PyMem_RawFree(program); return 0; } ``` Qui ne fait rien d'autre que démarrer un interpréteur Python. On peut compiler ce code d'un simple ``gcc python_from_c.c -o python_from_c `python-config --cflags --ldflags` -O0 -g`` et obtenir un petit binaire, qui, si on le lance (mais ni trop loin, ni trop fort), nous affiche la date du jour d'aujourd'hui. Lançons ce programme dans gdb : ```console $ gdb python_from_c (gdb) start [...] (gdb) n 5 Today is Wed Sep 30 19:12:48 2020 [...] ``` Arrivé là, on aimerait lancer ``pdb``. Finalement, rien de plus facile ! ```console (gdb) call PyRun_SimpleString("import pdb; pdb.set_trace()") [...] (pdb) ``` Hourra! On peut inspecter la pile Python, le tableau des globales etc! ```console (pdb) p ctime (pdb) globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'time': , 'ctime': , 'pdb': , '__return__': None} (pdb) exit() [...] (gdb) ``` Et voilà, on peut naviguer entre les deux mondes, avec une fluidité qui laisserait pantois de [`l'helium 4 à −270,98 °c`](https://fr.wikipedia.org/wiki/Superfluidit%C3%A9) Je me suis longtemps demandé comment faire ça, et cette solution m'enjouaille comme un enfant, alors hop, je partage !

AltStyle によって変換されたページ (->オリジナル) /