Это можно сделать , но это очень сложно, и одно неверное движение приведет к сбою программы (или к потере в неопределенном состоянии).
Вы можете использовать функцию C PyEval_GetGlobals()
, чтобы вернуть словарь глобальных слов (как если бы вы назвали globals()
в python), а затем использовать PyObject_Print()
распечатать этот объект в файл (самым простым из которых является то, к чему stdout
подключен).
Вы захотите запустить GDB и присоединить его к экземпляру python. Затем установите точку останова для функции, которая, как вы знаете, будет вызываться (если ваша программа печатает вывод, тогда PyObject_Print()
будет работать; в противном случае на этой странице есть некоторые функции, которые, вероятно, будут вызываться много.) программа достигнет точки останова, вы захотите отключить ее и распечатать глобальные значения.
Например, если моя программа на Python имеет PID 15847:
(gdb) attach 15847
Attaching to process 15847.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ............. done
0x00007fff870b5e52 in select$DARWIN_EXTSN ()
(gdb) break PyObject_Print
Breakpoint 1 at 0x10003d8f4
(gdb) c
Continuing.
В следующий раз, когда ваша программа отправит что-то напечатать:
Breakpoint 1, 0x000000010003d8f4 in PyObject_Print ()
(gdb) disable
(gdb) call (int)PyObject_Print((void*)PyEval_GetGlobals())
$1 = 0
(gdb) c
Continuing.
Затем в выходных данных вашей программы вы увидите глобальный словарь.