2013-05-24 38 views
18

Làm cách nào để gỡ lỗi lỗi phân đoạn Python?Làm cách nào để gỡ lỗi lỗi phân đoạn Python?

Chúng tôi đang cố gắng chạy mã python của chúng tôi trên SuSE 12.3. Chúng tôi nhận được lỗi phân đoạn lặp lại. Mã python đã hoạt động trên các nền tảng khác mà không có lỗi phân đoạn, trong nhiều năm.

Chúng tôi chỉ mã Python, không có phần mở rộng C. ....

Cách tốt nhất để gỡ lỗi này là gì? Tôi biết một chút ansi c, nhưng đó là cách đây mười năm ....

Python 2.7.5

Cập nhật

Các lỗi segmentation xảy ra trên phiên dịch shutdown.

tôi có thể chạy các kịch bản nhiều lần:

python -m pdb myscript.py arg1 arg1 
continue 
run 
continue 
run 

Nhưng lỗi Phân khúc xảy ra, nếu tôi rời khỏi pdb với Ctrl-d.

Cập nhật 2

bây giờ tôi cố gắng để gỡ lỗi nó với 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 

Cập nhật 3

Tôi đã cài đặt gdbinit từ http://hg.python.org/cpython/file/default/Misc/gdbinit và gỡ lỗi biểu tượng từ http://download.opensuse.org/debug/distribution/12.3/repo/oss/suse/x86_64/

(gdb) pystack 
No symbol "_PyUnicode_AsString" in current context. 

Bây giờ là gì?

Cập nhật 4 Chúng tôi đã cài đặt một RPM mới (python-2.7.5-3.1.x86_64). Chúng tôi nhận được ít segfaults, nhưng họ vẫn xảy ra. Dưới đây là liên kết để kho:

http://download.opensuse.org/repositories/devel:/languages:/python:/Factory/openSUSE_12.3/x86_64/

Cập nhật 5 Giải Quyết vấn đề ban đầu của tôi:

Đó là http://bugs.python.org/issue1856 (shutdown (thoát) có thể treo hoặc segfault với chủ đề daemon chạy)

Related: Detect Interpreter shut down in daemon thread

Trả lời

6

Có thể có một chuỗi daemon đang chạy? Có một lỗi reproduceable, được cố định chỉ cho 3.x, nhưng không phải cho 2.x:

http://bugs.python.org/issue1856:

shutdown (exit) can hang or segfault with daemon threads running 

Đây là câu trả lời cho câu hỏi của riêng tôi. Phải mất một thời gian để tìm ra gốc rễ của vấn đề.

Đây là câu hỏi tiếp theo: Làm thế nào để mã hóa xung quanh lỗi này: Detect Interpreter shut down in daemon thread

+0

Tôi cũng nhận được segfault về đóng ứng dụng của tôi. Làm thế nào để sửa lỗi này cho python 2,7? – Patrick

+0

@Patrick Xem http://stackoverflow.com/a/18099067/633961 – guettli

1

Bạn có thể sử dụng trình gỡ lỗi Python mo Dule bằng cách nhập pdb:

python -m pdb myscript.py 

nguồn: http://docs.python.org/2/library/pdb.html

+2

Tôi không nghĩ rằng một segfault có thể đến từ mã Python, và do đó 'pdb' có thể được giúp đỡ bất kỳ. – icecrime

+0

Cảm ơn câu trả lời, tôi đã cập nhật câu hỏi. Các lỗi seg xảy ra trên trình thông dịch tắt. – guettli

3

Nếu bạn đang thực hiện không có gì nhưng mã Python (thậm chí thông qua các module bên thứ ba đã nhập của mình), hơn một segfault lẽ có nghĩa là có một lỗi trong các phiên dịch hoặc một trong các mô đun C tích hợp của nó.

Bạn có thể build CPython and try to debug it yourself hoặc cố tạo ra tập lệnh nhỏ nhất tái tạo sự cố và file an issue.

3

tôi cho câu hỏi này vì Segmentation fault, nhưng không phải trên lối ra, chỉ nói chung, và tôi thấy rằng không có gì khác giúp một cách hiệu quả là faulthandler. Đó là một phần của Python 3.3, và bạn có thể cài đặt trong 2.7 bằng cách sử dụng pip.

+0

Tôi không biết người xử lý lỗi trước đây. Có vẻ tốt. Cảm ơn bạn. – guettli

Các vấn đề liên quan