Получить глобальную переменную во время работы программы Python - PullRequest
1 голос
/ 15 марта 2011

Я пишу программу командной строки Python 2.5 для CentOS 5.5, и она работает в течение 1 дня и все еще работает. Теперь я хочу завершить эту программу, но получить значение глобальной переменной.

Я сделал несколько Google. Кажется, единственный способ получить значение глобальной переменной - это присоединить программу Python к GDB.

Предположим, что глобальная переменная является списком, а ее имя resultlist. Как я могу получить его значение?

Ответы [ 2 ]

6 голосов
/ 15 марта 2011

Это можно сделать , но это очень сложно, и одно неверное движение приведет к сбою программы (или к потере в неопределенном состоянии).

Вы можете использовать функцию 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.

Затем в выходных данных вашей программы вы увидите глобальный словарь.

1 голос
/ 15 марта 2011

Боюсь, имена тебе не сильно помогут. Поскольку вы не встроили какой-либо механизм печати и ваш процесс уже запущен, вы в значительной степени облажались.

Если у вас есть представление о том, какие значения могут быть для вас наилучшим выбором, используйте сканер памяти процесса и начните возиться. Хотя я оцениваю ваши шансы на успех очень низко, извините.

...