Вопрос

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

  

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

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

Это было полезно?

Решение

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

(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 с питоном, если вы готовы перекомпилировать его. Процедура описана здесь.

Другие советы

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

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

Чтобы конкретно ответить на ваш вопрос об отладке с помощью GDB, вы можете прочитать " Отладку с помощью GDB & Quot; на питоне вики.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top