Python PyEnchant 段错误或无效指针

标签 python segmentation-fault ctypes pyenchant

我有一个调用 PyEnchant 的多线程 Python 应用程序。我不是 Python 专家,大部分代码都来自第三方。我所做的是添加代码以从多线程应用程序调用 PyEnchant。由于我进行了更改,应用程序运行了不同的时间长度然后崩溃。我在 Ubuntu 12.04 上运行它。 我收到这样的错误:

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 -s unlimited

和 ulimit 的各种其他值,但它似乎没有帮助。

我监控了以“top”运行的应用程序,它似乎没有使用太多资源。有时它会运行 5 分钟,有时会运行 15 分钟。在这些运行期间,它会处理数百个字符串并找到数百个未知单词。运行代码的机器没有已知问题,这是我的开发机器,其他一切都稳定运行。

任何人都可以阐明这些错误的含义吗?在我的 Python 代码中有什么我应该或不应该做的事情可以解决吗?我想这是一个内存问题(我对此知之甚少),我应该检查内存泄漏等吗?

最佳答案

我做了一些更多的测试,发现它在单个工作线程下工作正常。经过一番谷歌搜索后,我发现 http://aspell.net/在“需要做的事情”下说; “使 Aspell 线程安全。尽管 Aspell 本身不是多线程的,但我希望它是线程安全的,以便它可以被多线程程序使用。”我正在通过 Enchant 将 Aspell 与 PyEnchant 一起使用,所以我想我所看到的是可以预料的。 我联系了 Enchant 的作者 http://www.abisource.com/projects/enchant/他们说“Enchant 本身是线程安全的。不幸的是,它的一些后端可能不是,比如你在 Aspell 中发现的。这是我们可以在 Enchant 中解决的问题,不过,通过序列化对 Aspell 字典的所有访问,从而隐藏对用户的线程不安全。”我可以提出增强请求吗?所以我已经提交了增强请求,并期待在适当的时候进行增强。

关于Python PyEnchant 段错误或无效指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11892891/

相关文章:

c - 访问链接列表或在 Linux 上执行 malloc() 时出现段错误

c - 为什么我在创建此链接列表时遇到段错误?

c - 指针魔术有时会导致 SIGSEGV

python - python实现鼠标画圆圈的方法

python - 在没有reset_index()的情况下从pandas DataFrame索引中删除单个列

python - 使用 Selenium 模块创建 Exe : Py2exe/Pyinstaller

python - 使用lambda python将文件上传到s3后用表单数据更新mysql

Python日志分析工具/库

python - 从库返回的 ctypes 结构

Python:Ctypes如何检查内存管理