2008-11-07 2 views
4

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

Python Fatal Error: GC Object already tracked

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

+0

Вы используете эту программу в 64-битном Linux? – 2008-11-07 18:39:54

+0

Нет, 32-разрядный Linux. – 2008-11-07 19:09:11

ответ

5

Да, вы можете сделать такую ​​вещь:

(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 команду, определенную в файле питона gdbinit, но это не работает для меня. Обсуждается here, если вы хотите изучить его.

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

1

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

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

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

0

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

0

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