2012-08-09 91 views
3

我有一個調用PyEnchant的多線程Python應用程序。我不是Python專家,大部分代碼都來自第三方。我所做的是添加代碼以從多線程應用程序中調用PyEnchant。由於我進行了更改,因此應用程序運行的時間長短不一,然後崩潰。我在Ubuntu 12.04上運行它。 我得到的錯誤,像這樣的:Python PyEnchant分割錯誤或無效指針

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x7fffc5ffd700 (LWP 6858)] 
0x00007ffff4424854 in ??() from /usr/lib/libenchant.so.1 
(gdb) backtrace 
#0 0x00007ffff4424854 in ??() from /usr/lib/libenchant.so.1 
#1 0x00007ffff442517d in enchant_dict_check() from /usr/lib/libenchant.so.1 
#2 0x00007ffff48a2ea4 in ffi_call_unix64() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#3 0x00007ffff48a28c5 in ffi_call() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#4 0x00007ffff48932c2 in _ctypes_callproc() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#5 0x00007ffff4893aa2 in ??() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#6 0x00000000004c7c76 in PyObject_Call() 
#7 0x000000000042aa4a in PyEval_EvalFrameEx() 
#8 0x000000000042abe2 in PyEval_EvalFrameEx() 
#9 0x000000000042abe2 in PyEval_EvalFrameEx() 
#10 0x00000000004317f2 in PyEval_EvalCodeEx() 
#11 0x000000000054aa40 in ??() 
#12 0x00000000004c7c76 in PyObject_Call() 
#13 0x000000000049e9ba in ??() 
#14 0x00000000004c7c76 in PyObject_Call() 
#15 0x00000000004c7d36 in PyEval_CallObjectWithKeywords() 
#16 0x0000000000443e3a in ??() 
#17 0x000000000042a862 in PyEval_EvalFrameEx() 
#18 0x000000000042abe2 in PyEval_EvalFrameEx() 
#19 0x000000000042abe2 in PyEval_EvalFrameEx() 

*** glibc detected *** /usr/bin/python: free(): invalid pointer: 0x00007fffd4000178 *** 
(gdb) backtrace 
#0 0x00007ffff68fa445 in raise() from /lib/x86_64-linux-gnu/libc.so.6 
#1 0x00007ffff68fdbab in abort() from /lib/x86_64-linux-gnu/libc.so.6 
#2 0x00007ffff6937e2e in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#3 0x00007ffff6942626 in ??() from /lib/x86_64-linux-gnu/libc.so.6 
#4 0x00007ffff4424861 in ??() from /usr/lib/libenchant.so.1 
#5 0x00007ffff442517d in enchant_dict_check() from /usr/lib/libenchant.so.1 
#6 0x00007ffff48a2ea4 in ffi_call_unix64() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#7 0x00007ffff48a28c5 in ffi_call() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#8 0x00007ffff48932c2 in _ctypes_callproc() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#9 0x00007ffff4893aa2 in ??() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#10 0x00000000004c7c76 in PyObject_Call() 
#11 0x000000000042aa4a in PyEval_EvalFrameEx() 
#12 0x000000000042abe2 in PyEval_EvalFrameEx() 
#13 0x000000000042abe2 in PyEval_EvalFrameEx() 
#14 0x00000000004317f2 in PyEval_EvalCodeEx() 
#15 0x000000000054aa40 in ??() 
#16 0x00000000004c7c76 in PyObject_Call() 
#17 0x000000000049e9ba in ??() 
#18 0x00000000004c7c76 in PyObject_Call() 
#19 0x00000000004c7d36 in PyEval_CallObjectWithKeywords() 
#20 0x0000000000443e3a in ??() 
#21 0x000000000042a862 in PyEval_EvalFrameEx() 
#22 0x000000000042abe2 in PyEval_EvalFrameEx() 

Program received signal SIGSEGV, Segmentation fault. 
[Switching to Thread 0x7fffe57fa700 (LWP 17532)] 
0x0000000000000000 in ??() 
(gdb) backtrace 
#0 0x0000000000000000 in ??() 
#1 0x00007ffff3f5fe33 in g_hash_table_lookup() from /lib/x86_64-linux-gnu/libglib-2.0.so.0 
#2 0x00007ffff44245a3 in ??() from /usr/lib/libenchant.so.1 
#3 0x00007ffff442518b in enchant_dict_check() from /usr/lib/libenchant.so.1 
#4 0x00007ffff48a2ea4 in ffi_call_unix64() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#5 0x00007ffff48a28c5 in ffi_call() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#6 0x00007ffff48932c2 in _ctypes_callproc() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#7 0x00007ffff4893aa2 in ??() from /usr/lib/python2.7/lib-dynload/_ctypes.so 
#8 0x00000000004c7c76 in PyObject_Call() 
#9 0x000000000042aa4a in PyEval_EvalFrameEx() 
#10 0x000000000042abe2 in PyEval_EvalFrameEx() 
#11 0x000000000042abe2 in PyEval_EvalFrameEx() 
#12 0x00000000004317f2 in PyEval_EvalCodeEx() 
#13 0x000000000054aa40 in ??() 
#14 0x00000000004c7c76 in PyObject_Call() 
#15 0x000000000049e9ba in ??() 
#16 0x00000000004c7c76 in PyObject_Call() 
#17 0x00000000004c7d36 in PyEval_CallObjectWithKeywords() 
#18 0x0000000000443e3a in ??() 
#19 0x000000000042a862 in PyEval_EvalFrameEx() 
#20 0x000000000042abe2 in PyEval_EvalFrameEx() 
#21 0x000000000042abe2 in PyEval_EvalFrameEx() 
#22 0x000000000042abe2 in PyEval_EvalFrameEx() 

閱讀另一篇文章我試過的ulimit但

ulimit -s unlimited 

和各種其他值做了n似乎沒有幫助。

我已經監視了運行「top」的應用程序,它似乎沒有使用太多的資源。有時它會在15分鐘內運行15分鐘。在這些運行過程中,它處理數百個字符串並發現數百個未知單詞。代碼運行的機器沒有已知的問題,它是我的開發機器其他一切運行穩定。

任何人都可以闡明這些錯誤是什麼意思?有什麼我應該或不應該在我的Python代碼中進行排序嗎?我想這是一個內存問題(我知道的東西很少),我應該檢查內存泄漏等?

回答

2

我做了一些更多的測試,發現它對單個工作線程工作正常。在Googleing之後,我發現http://aspell.net/在「需要完成的事情」中說過; 「讓Aspell線程安全,儘管Aspell本身並不是多線程的,但我希望它是線程安全的,以便它可以被多線程程序使用。」我通過附魔與PyEnchant一起使用Aspell,所以我猜想我所看到的是可以預期的。我接觸了附魔http://www.abisource.com/projects/enchant/的作者,他們說:「附魔本身就是線程安全的,不幸的是,它的一些後端可能不是,比如你在Aspell中找到的,這是我們可以在Enchant中解決的事情,通過序列化對Aspell字典的所有訪問,從而隱藏線程不安全性給用戶。「並可以提交增強請求。所以我提出了一個改進請求,並期待在適當的時候進行改進。