Как отладить ошибку сегментации Python?
Как я могу отладить ошибку сегментации Python?
Мы пытаемся запустить наш код на Python на SuSE 12.3. Мы получаем воспроизводимые ошибки сегментации. В течение многих лет код python работает на других платформах без ошибок сегментации.
Мы используем только код Python, расширение C.
Каков наилучший способ отладки этого? Я знаю немного ansi c, но это было десять лет назад....
Python 2.7.5
Обновление
Ошибка сегментации происходит при выключении интерпретатора.
Я могу запустить script несколько раз:
python -m pdb myscript.py arg1 arg1
continue
run
continue
run
Но ошибки сегментации происходят, если я оставлю pdb с помощью ctrl-d.
Обновление 2
Теперь я пытаюсь отладить его с помощью gdb:
gdb
> file python
> run myscript.py arg1 arg2
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffefbe2700 (LWP 15483)]
0x00007ffff7aef93c in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
(gdb) bt
#0 0x00007ffff7aef93c in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#1 0x00007ffff7af5303 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.7.so.1.0
#2 0x00007ffff7adc858 in ?? () from /usr/lib64/libpython2.7.so.1.0
#3 0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#4 0x00007ffff7af1082 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#5 0x00007ffff7af233d in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#6 0x00007ffff7af233d in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#7 0x00007ffff7af5303 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.7.so.1.0
#8 0x00007ffff7adc5b6 in ?? () from /usr/lib64/libpython2.7.so.1.0
#9 0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#10 0x00007ffff7ad9171 in ?? () from /usr/lib64/libpython2.7.so.1.0
#11 0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#12 0x00007ffff7aeeb62 in PyEval_CallObjectWithKeywords () from /usr/lib64/libpython2.7.so.1.0
#13 0x00007ffff7acc757 in ?? () from /usr/lib64/libpython2.7.so.1.0
#14 0x00007ffff7828e0f in start_thread () from /lib64/libpthread.so.0
#15 0x00007ffff755c7dd in clone () from /lib64/libc.so.6
Обновление 3
Я установил gdbinit из http://hg.python.org/cpython/file/default/Misc/gdbinit
и отладочные символы из http://download.opensuse.org/debug/distribution/12.3/repo/oss/suse/x86_64/
(gdb) pystack
No symbol "_PyUnicode_AsString" in current context.
Что теперь?
Обновление 4
Мы установили новый RPM (python-2.7.5-3.1.x86_64). Мы получаем меньше segfaults, но они все еще происходят.
Вот ссылка на репозиторий:
http://download.opensuse.org/repositories/devel:/languages:/python:/Factory/openSUSE_12.3/x86_64/
Обновление 5
Решил мою первоначальную проблему:
Это было http://bugs.python.org/issue1856 (выключение (выход) может зависать или segfault с запущенными потоками демона)
Связано: Обнаружение перевода интерпретатора в потоке демона
Ответы
Ответ 1
Может быть, существует поток демона? Существует воспроизводимая ошибка, которая была исправлена только для 3.x, но не для 2.x:
http://bugs.python.org/issue1856:
shutdown (exit) can hang or segfault with daemon threads running
Это ответ на мой вопрос. Потребовалось некоторое время, чтобы найти корень проблемы.
Вот следующий вопрос: как закодировать эту ошибку: Обнаружение перевода интерпретатора в потоке демона
Ответ 2
Если вы выполняете ничего, кроме кода Python (даже через импортированные сторонние модули), чем segfault, вероятно, означает наличие ошибки в интерпретаторе или одном из встроенных модулей C.
Вы можете построить CPython и попробовать его самостоятельно отладить или попытаться создать наименьший script, который воспроизводит сбой и создать файл.
Ответ 3
Вы можете использовать модуль Python Debugger, импортировав pdb:
python -m pdb myscript.py
источник: http://docs.python.org/2/library/pdb.html
Ответ 4
Я получил этот вопрос из-за Segmentation fault
, но не на выходе, как правило, и я обнаружил, что ничто иное не помогло так эффективно, как faulthandler. Это часть Python 3.3, и вы можете установить ее в версии 2.7 с помощью pip
.