Отладка памяти Python с помощью GDB - PullRequest
4 голосов
/ 07 ноября 2008

У нас есть приложение Linux, которое использует привязки Python OpenSSL, и я подозреваю, что оно вызывает случайные сбои. Иногда мы видим сбой с сообщением:

Неустранимая ошибка Python: объект GC уже отслежен

, что может показаться либо ошибкой программирования со стороны библиотеки, либо признаком повреждения памяти. Есть ли способ узнать последнюю строку исходного кода Python, которую он выполнил, учитывая файл ядра? Или если он прикреплен в GDB? Я понимаю, что это, вероятно, весь скомпилированный байт-код, но я надеюсь, что кто-то там мог иметь дело с этим. В настоящее время он работает с активным модулем трассировки, и мы надеемся, что это произойдет снова, но это может занять много времени.

Ответы [ 4 ]

5 голосов
/ 07 ноября 2008

Да, вы можете делать такие вещи:

(gdb) print PyRun_SimpleString("import traceback; traceback.print_stack()")
  File "<string>", line 1, in <module>
  File "/var/tmp/foo.py", line 2, in <module>
    i**2
  File "<string>", line 1, in <module>
$1 = 0

Также должна быть возможность использовать команду pystack, определенную в файле python gdbinit , но она не работает для меня. Это обсуждается здесь , если вы хотите посмотреть на это.

Также, если вы подозреваете проблемы с памятью, стоит отметить, что вы можете использовать valgrind с python, если вы готовы перекомпилировать его. Процедура описана здесь .

1 голос
/ 07 ноября 2008

Если у вас есть Mac или Sun Box, вы можете использовать dtrace и версию python, скомпилированную с dtrace, чтобы выяснить, что приложение делало в то время. Примечание: в 10.5 python предварительно скомпилирован с dtrace, который действительно хорош и удобен.

Если это недоступно для вас, вы можете импортировать gc и включить отладку, которую затем сможете поместить в файл журнала.

Чтобы конкретно ответить на ваш вопрос об отладке с помощью GDB, вы можете прочитать « Отладка с помощью GDB » в викитоне Python.

0 голосов
/ 07 ноября 2008

В дополнение ко всему вышесказанному можно быстро внедрить средство трассировки adhoc через модуль трассировки .

0 голосов
/ 07 ноября 2008

Если вы используете CDLL для переноса библиотеки C в python, а это 64-битный linux, есть большая вероятность, что ваша оболочка CDLL неправильно настроена. CDLL по умолчанию возвращает типы возврата int на всех платформах (должно быть длинным в 64-битных системах) и просто ожидает, что вы передадите правильные аргументы. В этом случае вам может потребоваться проверка оболочки CDLL ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...