应用程序在c ++中的python扩展函数中随机提供分割错误 [英] Application gives segmentation fault randomly in python extension functions in c++

查看:144
本文介绍了应用程序在c ++中的python扩展函数中随机提供分割错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到一些stange问​​题在python扩展在c + +。非常感谢任何帮助或建议。



设置上下文。

使用C ++中的嵌入式python来执行python脚本。我也使用python扩展在c + +给python脚本调用C ++函数的能力。



有什么问题?


  1. 当我从模块方法表评论方法入口,如我已经显示如下。应用程序永远不会崩溃,或者我根本没有遇到segfault。

      static PyMethodDef sa_methods [] = {

    // {GetBlue,(PyCFunction)sa_GetBlue,METH_VARARGS,PyDoc_STR(fetches Blue color)},

    // {GetRed,(PyCFunction)sa_GetRed,METH_VARARGS,PyDoc_STR获取红色)},

    {GetYellow,(PyCFunction)sa_GetYellow,METH_VARARGS,PyDoc_STR(获取黄色)},

    {GetPink (PyCFunction)sa_GetPink,METH_VARARGS,PyDoc_STR(fetches pink color)},

    {NULL,NULL,0,NULL}

    }


  2. 当我从方法表中删除方法注释如下所示。应用程序总是在随机处理20000到50000个请求之间崩溃。

      static PyMethodDef sa_methods [] = {

    {GetBlue,(PyCFunction)sa_GetBlue,METH_VARARGS,PyDoc_STR(fetches Blue color)},

    {GetRed,(PyCFunction)sa_GetRed,METH_VARARGS,PyDoc_STR )},

    (GetYellow,(PyCFunction)sa_GetYellow,METH_VARARGS,PyDoc_STR(fetches yellow color)},

    {GetPink,(PyCFunction)sa_GetPink ,METH_VARARGS,PyDoc_STR(fetches pink color)},

    {NULL,NULL,0,NULL}

    };




请在下面找到我每次获取的堆栈跟踪。对象/ object.c:1599
#1 0x00002b700142d6e3的PyNumber_CoerceEx(pv = 0x41801798,pw = 0x41801790)中的

 #0 0x00002b700146c4d7在Objects / abstract.c下的PyNumber_Multiply(v = 0x41801798,w = 0x41801790)中的Objects / abstract.c:929 
#2 0x00002b7001431e08处的binary_op1(v = 0x2aaaac079600,w = 0x2b7001750550,op_slot = 16):1188 $在python / ceval.c中的PyEval_EvalFrameEx(f = 0x8127780,throwflag =< value optimized out>)中的b $ b#3 0x00002b70014c4326:call_function中的1118
#4 0x00002b70014c8493(f = 0x996e660,throwflag =在Python / ceval.c:2389
#6 0x00002b70014c8493在call_function()中的Python / ceval.c:3792
#5 PyEval_EvalFrameEx(f = 0x996e660,throwflag =< value optimized out>在Python / ceval.c:3792
#7中的PyEval_EvalFrameEx(f = 0x2aaac30aeb50,throwflag =< value optimized out>)在Python / ceval.c:2389
#8 0x00002b70014c8d9f在PyEval_EvalCodeEx(co = 0x2aaaad7dc558,globals =< value optimized out>,locals =< value optimized out> ;, args = 0x2aaac6ab59a0,argcount = 2,
kws = 0x2aaac6ab59b0,kwcount =在python / ceval下的call_function(f = 0x2aaac6ab57d0,throwflag =< value optimized out>)中的python / ceval.c:2968
#9 0x00002b70014c6df3处设置为0,defs = 0x7819128,defcount = 1,closure = 0x0。在pyEval_EvalCodeEx中的Python / ceval.c:2389
#11 0x00002b70014c8d9f处的c:3802
#10 PyEval_EvalFrameEx(f = 0x2aaac6ab57d0,throwflag =< value optimized out>)co = 0x2aaabdf8e828,globals =在Python / ceval下的值优化输出>,locals =< value optimized out>,args = 0x2aaac65bcbf0,argcount = 2,
kws = 0x2aaac65bcc00,kwcount = 0,defs = 0x7819c28,defcount = 1,closure = 0x0) .c:2968
#12 0x00002b70014c6df3在python / ceval.c的call_function(f = 0x2aaac65bca40,throwflag =< value optimized out>)中:3802
#13 PyEval_EvalFrameEx(f = 0x2aaac65bca40,throwflag = Python中的call_function(f = 0x2aaac6301630,throwflag =< value optimized out>)中的Python / ceval.c:2389
#14 0x00002b70014c8493:3792
#在Python / ceval.c中的PyEval_EvalFrameEx(f = 0x2aaac6301630,throwflag =< value optimized out>):2389
#16 0x00002b70014c8d9f in PyEval_EvalCodeEx(co = 0x6c7f558,globals =< value optimized out>,locals = ; value optimized out> args = 0x2aaac55963e8,argcount = 2,
kws = 0x2aaac55963f8,kwcount = 0,defs = 0xd83fce8,defcount = 1,closure = 0x0)在Python / ceval.c:2968
在Python / ceval.c:3802
#call_function(f = 0x2aaac5596240,throwflag =< value optimized out>)中的#17 0x00002b70014c6df3; Python:PyEval_EvalFrameEx(f = 0x2aaac5596240,throwflag =< value optimized out> /ceval.c:2389
#19 0x00002b70014c8d9f in PyEval_EvalCodeEx(co = 0x6c7fcd8,globals =< value optimized out>,locals =< value optimized out> ;, args = 0x2aaac6fbc328,argcount = 2,
在call_function中的Python / ceval.c:2968
#20 0x00002b70014c6df3(f = 0x2aaac6fbc1a0,throwflag =< value optimized out> kws = 0x2aaac6fbc338,kwcount = 0,defs = 0xd83fc68,defcount = 1,closure = 0x0) )在python / ceval.c:3802
#21 PyEval_EvalFrameEx(f = 0x2aaac6fbc1a0,throwflag = )在Python / ceval.c:2389
#22 0x00002b70014c8d9f在PyEval_EvalCodeEx 0x6c7f648,globals =< value optimized out> ;, locals =< value optimized out> ;, args = 0x1,argcount = 0,kws = 0x2aaac3e32558,
kwcount = 0,defs = 0xd83ffa8,defcount = Python / ceval.c中的Python / ceval.c中的Python / ceval.c:2968
#23 0x00002b70014c6df3(f = 0x2aaac3e323d0,throwflag =< value optimized out>):3802
#24 PyEval_EvalFrameEx = 0x2aaa7f70a8,globals =< value optimized out>,locals =< value optimized out>)中的Python / ceval.c:2389
#25 0x00002b70014c8d9f(= 0x2aaac3e323d0,throwflag = ; args = 0x0,argcount = 0,kws = 0x1325c6a8,
kwcount = 0,defs = 0x0,defcount = 0,closure = 0x2aaaad18e990)在Python / ceval.c:2968
#26 0x00002b70014c6df3在python / ceval.c中的call_function(f = 0x1325c480,throwflag =< value optimized out>)在Python / ceval.c:3802
#27 PyEval_EvalFrameEx(f = 0x1325c480,throwflag =< value optimized out> :2389
#28 0x00002b70014c8d9f in PyEval_EvalCodeEx(co = 0x2aaaad7f77b0,globals =< value optimized out>,locals =< value optimized out> ;, args = 0x1,argcount = 1,kws = 0x2aaac5ec1d08,
在python / ceval.c中的call_function(f = 0x2aaac5ec1b00,throwflag =< value optimized out>)中的Python / ceval.c:2968
#29 0x00002b70014c6df3处的kwcount = 0,defs = 0x2aaaacfdf5e8,defcount =在call_function(f = 0xa926080,throwflag = 0)中,在Python / ceval.c:2389
#31 0x00002b70014c8493处的ceval.c:3802
#30 PyEval_EvalFrameEx(f = 0x2aaac5ec1b00,throwflag =在Python / ceval.c:3792
#33的PyEval_EvalFrameEx(f = 0xa926080,throwflag =< value optimized out>)在Python / ceval.c:2389
#33在Python / ceval.c中调用call_function(f = 0x8e4bd40,throwflag =< value optimized out>)中的0x00002b70014c8493:3792
#34 PyEval_EvalFrameEx(f = 0x8e4bd40,throwflag =< value optimized out>) .c:2389
#35 0x00002b70014c8d9f in PyEval_EvalCodeEx(co = 0x2aaabc9f7648,globals =< value optimized out> ;, locals =< value optimized out> ;, args = 0x9ff5f58,argcount = 1,
- -Type< return>继续,或q< return>退出 -
kws = 0x9ff5f60,kwcount = 0,defs = 0x0,defcount = 0,closure = 0x2aaaacfdfc50)在Python / ceval.c:2968
#36 0x00002b70014c6df3 call_function(f = 0x9ff5dc0 ,在Python / ceval.c:3802
#37上的PyEval_EvalFrameEx(f = 0x9ff5dc0,throwflag =< value optimized out>)在Python / ceval.c:2389 $ b $在python / ceval.c中的call_function(f = 0xdb993e0,throwflag = #39 PyEval_EvalFrameEx(f = 0xdb993e0,throwflag =< value optimized out>)at Python / ceval.c:2389
#40 0x00002b70014c8d9f in PyEval_EvalCodeEx(co = 0x2aaabd820990,globals =< value optimized out> ;, locals =< value optimized out> ;, args = 0x2aaaacfdf8a8,argcount = 1,kws = 0x0 (func = 0x7d898c0,arg = 0x2aaaacfdf890,kw = 0x0)中的Python / ceval.c:2968
#41 0x00002b700145815d,
kwcount = 0,defs = 0x0,defcount = 0,closure = 0x0 )在Objects / abstract.c中的Objects / funcobject.c:524
#42 0x00002b700142d318(func = 0x7d898c0,arg = 0x2aaaacfdf890,kw = 0x0):2492
#43 0x00002b700143cd7f in instancemethod_call在对象/摘要中的PyObject_Call(func = 0x7554690,arg = 0x2aaaac04d050,kw = 0x0)中的Objects / classobject.c:2579
#44 0x00002b700142d318中的值=< value optimized out> arg = 0x2aaaacfdf890,kw = 0x0 .c:2492
#45 0x00002b70014c0e16在pyEval_CallObjectWithKeywords(func = 0x7554690,arg = 0x2aaaac04d050,kw = 0x0)在Python / ceval.c:3575
#46 0x00002b70014f9dcd在t_bootstrap(boot_raw = 0x2aaac76e67c0)at。 /Modules/threadmodule.c:425
#47 0x00000033c720677d(从/lib64/libpthread.so.0开始的start_thread())
#48 0x00000033c66d33在clone()中从/lib64/libc.so.6


解决方案

我得到了解决这个问题,



>函数sa_GetBlue和sa_GetRed返回Py_False。在返回Py_False或Py_True之前,需要增加保存这些值的变量的引用计数,否则可能会破坏解释器的内存状态;它不会立即崩溃,但可能会崩溃在任何时间点。在我的情况下,它是处理20000到50000请求后崩溃。



请在下面的链接,了解我想解释的事情。



为什么 - 不是python-keep-a-reference-count-on-false-and-true



@doomster和@Omnifarious;感谢您提供的意见和指示。


I am experiencing some stange problem in python extension in c++. I appreciate any help or suggestions.

To set context.

I am using embedded python in C++ to execute python scripts. I am also using python extension in c++ to give ability to python script to call the C++ function.

What is problem?

  1. When I comment method entry from modules "method table" like I have shown below. Application never crashes or I am not experiencing segfault at all.

    static PyMethodDef sa_methods[] = {
    
    //{"GetBlue",(PyCFunction)sa_GetBlue,METH_VARARGS,PyDoc_STR("fetches Blue color")},
    
    //{"GetRed",(PyCFunction)sa_GetRed,METH_VARARGS,PyDoc_STR("fetches Red color")},
    
    {"GetYellow",(PyCFunction)sa_GetYellow,METH_VARARGS,PyDoc_STR("fetches yellow color")},                        
    
    {"GetPink",(PyCFunction)sa_GetPink,METH_VARARGS,PyDoc_STR("fetches pink color")},
    
    {NULL, NULL, 0, NULL}
    
    };
    

  2. When I remove method comments from the method entry from modules "method table" like I have shown below. Application always crashes in between processing 20000 to 50000 requests randomly.

    static PyMethodDef sa_methods[] = {
    
    {"GetBlue",(PyCFunction)sa_GetBlue,METH_VARARGS,PyDoc_STR("fetches Blue color")},
    
    {"GetRed",(PyCFunction)sa_GetRed,METH_VARARGS,PyDoc_STR("fetches Red color")},
    
    {"GetYellow",(PyCFunction)sa_GetYellow,METH_VARARGS,PyDoc_STR("fetches yellow color")},                        
    
    {"GetPink",(PyCFunction)sa_GetPink,METH_VARARGS,PyDoc_STR("fetches pink color")},
    
    {NULL, NULL, 0, NULL}
    
    };
    

I have kept above two methods empty and they are merely returning Py_False.

Please find below the stack trace that I am getting every time.

#0  0x00002b700146c4d7 in PyNumber_CoerceEx (pv=0x41801798, pw=0x41801790) at Objects/object.c:1599
#1  0x00002b700142d6e3 in binary_op1 (v=0x2aaaac079600, w=0x2b7001750550, op_slot=16) at Objects/abstract.c:929
#2  0x00002b7001431e08 in PyNumber_Multiply (v=0x41801798, w=0x41801790) at Objects/abstract.c:1188
#3  0x00002b70014c4326 in PyEval_EvalFrameEx (f=0x8127780, throwflag=<value optimized out>) at Python/ceval.c:1118
#4  0x00002b70014c8493 in call_function (f=0x996e660, throwflag=<value optimized out>) at Python/ceval.c:3792
#5  PyEval_EvalFrameEx (f=0x996e660, throwflag=<value optimized out>) at Python/ceval.c:2389
#6  0x00002b70014c8493 in call_function (f=0x2aaac30aeb50, throwflag=<value optimized out>) at Python/ceval.c:3792
#7  PyEval_EvalFrameEx (f=0x2aaac30aeb50, throwflag=<value optimized out>) at Python/ceval.c:2389
#8  0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x2aaaad7dc558, globals=<value optimized out>, locals=<value optimized out>, args=0x2aaac6ab59a0, argcount=2,
    kws=0x2aaac6ab59b0, kwcount=0, defs=0x7819128, defcount=1, closure=0x0) at Python/ceval.c:2968
#9  0x00002b70014c6df3 in call_function (f=0x2aaac6ab57d0, throwflag=<value optimized out>) at Python/ceval.c:3802
#10 PyEval_EvalFrameEx (f=0x2aaac6ab57d0, throwflag=<value optimized out>) at Python/ceval.c:2389
#11 0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x2aaabdf8e828, globals=<value optimized out>, locals=<value optimized out>, args=0x2aaac65bcbf0, argcount=2,
    kws=0x2aaac65bcc00, kwcount=0, defs=0x7819c28, defcount=1, closure=0x0) at Python/ceval.c:2968
#12 0x00002b70014c6df3 in call_function (f=0x2aaac65bca40, throwflag=<value optimized out>) at Python/ceval.c:3802
#13 PyEval_EvalFrameEx (f=0x2aaac65bca40, throwflag=<value optimized out>) at Python/ceval.c:2389
#14 0x00002b70014c8493 in call_function (f=0x2aaac6301630, throwflag=<value optimized out>) at Python/ceval.c:3792
#15 PyEval_EvalFrameEx (f=0x2aaac6301630, throwflag=<value optimized out>) at Python/ceval.c:2389
#16 0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x6c7f558, globals=<value optimized out>, locals=<value optimized out>, args=0x2aaac55963e8, argcount=2,
    kws=0x2aaac55963f8, kwcount=0, defs=0xd83fce8, defcount=1, closure=0x0) at Python/ceval.c:2968
#17 0x00002b70014c6df3 in call_function (f=0x2aaac5596240, throwflag=<value optimized out>) at Python/ceval.c:3802
#18 PyEval_EvalFrameEx (f=0x2aaac5596240, throwflag=<value optimized out>) at Python/ceval.c:2389
#19 0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x6c7fcd8, globals=<value optimized out>, locals=<value optimized out>, args=0x2aaac6fbc328, argcount=2,
    kws=0x2aaac6fbc338, kwcount=0, defs=0xd83fc68, defcount=1, closure=0x0) at Python/ceval.c:2968
#20 0x00002b70014c6df3 in call_function (f=0x2aaac6fbc1a0, throwflag=<value optimized out>) at Python/ceval.c:3802
#21 PyEval_EvalFrameEx (f=0x2aaac6fbc1a0, throwflag=<value optimized out>) at Python/ceval.c:2389
#22 0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x6c7f648, globals=<value optimized out>, locals=<value optimized out>, args=0x1, argcount=0, kws=0x2aaac3e32558,
    kwcount=0, defs=0xd83ffa8, defcount=1, closure=0x0) at Python/ceval.c:2968
#23 0x00002b70014c6df3 in call_function (f=0x2aaac3e323d0, throwflag=<value optimized out>) at Python/ceval.c:3802
#24 PyEval_EvalFrameEx (f=0x2aaac3e323d0, throwflag=<value optimized out>) at Python/ceval.c:2389
#25 0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x2aaaad7f70a8, globals=<value optimized out>, locals=<value optimized out>, args=0x0, argcount=0, kws=0x1325c6a8,
    kwcount=0, defs=0x0, defcount=0, closure=0x2aaaad18e990) at Python/ceval.c:2968
#26 0x00002b70014c6df3 in call_function (f=0x1325c480, throwflag=<value optimized out>) at Python/ceval.c:3802
#27 PyEval_EvalFrameEx (f=0x1325c480, throwflag=<value optimized out>) at Python/ceval.c:2389
#28 0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x2aaaad7f77b0, globals=<value optimized out>, locals=<value optimized out>, args=0x1, argcount=1, kws=0x2aaac5ec1d08,
    kwcount=0, defs=0x2aaaacfdf5e8, defcount=1, closure=0x0) at Python/ceval.c:2968
#29 0x00002b70014c6df3 in call_function (f=0x2aaac5ec1b00, throwflag=<value optimized out>) at Python/ceval.c:3802
#30 PyEval_EvalFrameEx (f=0x2aaac5ec1b00, throwflag=<value optimized out>) at Python/ceval.c:2389
#31 0x00002b70014c8493 in call_function (f=0xa926080, throwflag=<value optimized out>) at Python/ceval.c:3792
#32 PyEval_EvalFrameEx (f=0xa926080, throwflag=<value optimized out>) at Python/ceval.c:2389
#33 0x00002b70014c8493 in call_function (f=0x8e4bd40, throwflag=<value optimized out>) at Python/ceval.c:3792
#34 PyEval_EvalFrameEx (f=0x8e4bd40, throwflag=<value optimized out>) at Python/ceval.c:2389
#35 0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x2aaabc9f7648, globals=<value optimized out>, locals=<value optimized out>, args=0x9ff5f58, argcount=1,
---Type <return> to continue, or q <return> to quit---
    kws=0x9ff5f60, kwcount=0, defs=0x0, defcount=0, closure=0x2aaaacfdfc50) at Python/ceval.c:2968
#36 0x00002b70014c6df3 in call_function (f=0x9ff5dc0, throwflag=<value optimized out>) at Python/ceval.c:3802
#37 PyEval_EvalFrameEx (f=0x9ff5dc0, throwflag=<value optimized out>) at Python/ceval.c:2389
#38 0x00002b70014c8493 in call_function (f=0xdb993e0, throwflag=<value optimized out>) at Python/ceval.c:3792
#39 PyEval_EvalFrameEx (f=0xdb993e0, throwflag=<value optimized out>) at Python/ceval.c:2389
#40 0x00002b70014c8d9f in PyEval_EvalCodeEx (co=0x2aaabd820990, globals=<value optimized out>, locals=<value optimized out>, args=0x2aaaacfdf8a8, argcount=1, kws=0x0,
    kwcount=0, defs=0x0, defcount=0, closure=0x0) at Python/ceval.c:2968
#41 0x00002b700145815d in function_call (func=0x7d898c0, arg=0x2aaaacfdf890, kw=0x0) at Objects/funcobject.c:524
#42 0x00002b700142d318 in PyObject_Call (func=0x7d898c0, arg=0x2aaaacfdf890, kw=0x0) at Objects/abstract.c:2492
#43 0x00002b700143cd7f in instancemethod_call (func=<value optimized out>, arg=0x2aaaacfdf890, kw=0x0) at Objects/classobject.c:2579
#44 0x00002b700142d318 in PyObject_Call (func=0x7554690, arg=0x2aaaac04d050, kw=0x0) at Objects/abstract.c:2492
#45 0x00002b70014c0e16 in PyEval_CallObjectWithKeywords (func=0x7554690, arg=0x2aaaac04d050, kw=0x0) at Python/ceval.c:3575
#46 0x00002b70014f9dcd in t_bootstrap (boot_raw=0x2aaac76e67c0) at ./Modules/threadmodule.c:425
#47 0x00000033c720677d in start_thread () from /lib64/libpthread.so.0
#48 0x00000033c66d33ed in clone () from /lib64/libc.so.6

解决方案

I got solution for this problem which has ultimately gave me as well as my client huge relief.

And here is the reason and solution.

The functions "sa_GetBlue" and "sa_GetRed" was returning "Py_False". Before returning "Py_False" or "Py_True" you need to increase the reference count of the variable holding these values otherwise It may corrupt memory state of the interpreter; it would not crash immediately but may crash at any point of time. In my case, It was crashing after processing 20000 to 50000 requests.

Please check below link to get more idea about what I am trying to explain.

why-does-python-keep-a-reference-count-on-false-and-true

@doomster and @Omnifarious; Thank you for your comment and direction that you have provided.

这篇关于应用程序在c ++中的python扩展函数中随机提供分割错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆