내 개발 환경 (Ubuntu 12.04)에서 제대로 작동하지만 (LinOS가 CentOS를 실행하는) 내 프로덕션 환경에서 코어를 덤프하는 Python 코드가 있습니다.파이썬 libsvm 코어 덤프
*** glibc detected *** python2.7: double free or corruption (out): 0x090cba60 ***
======= Backtrace: =========
/lib/i686/nosegneg/libc.so.6(+0x717b1)[0xb763d7b1]
/lib/i686/nosegneg/libc.so.6(+0x73f01)[0xb763ff01]
/home/michael/libsvm-3.16/python/../libsvm.so.2(svm_free_model_content+0xe2)[0xb6e0c6b2]
/home/michael/libsvm-3.16/python/../libsvm.so.2(svm_free_and_destroy_model+0x2c)[0xb6e0c70c]
/home/michael/lib/python2.7/lib-dynload/_ctypes.so(ffi_call_SYSV+0x17)[0xb71e375f]
/home/michael/lib/python2.7/lib-dynload/_ctypes.so(ffi_call+0x5b)[0xb71e35ab]
/home/michael/lib/python2.7/lib-dynload/_ctypes.so(_ctypes_callproc+0x32d)[0xb71d82ad]
/home/michael/lib/python2.7/lib-dynload/_ctypes.so(+0x703e)[0xb71d003e]
python2.7(PyObject_Call+0x4a)[0x805d90a]
python2.7(PyEval_EvalFrameEx+0x3c0a)[0x80e04ba]
python2.7(PyEval_EvalCodeEx+0x7bb)[0x80e2c1b]
python2.7[0x813ee2a]
python2.7(PyObject_Call+0x4a)[0x805d90a]
python2.7[0x80657f1]
python2.7(PyObject_Call+0x4a)[0x805d90a]
python2.7(PyEval_CallObjectWithKeywords+0x42)[0x80db852]
python2.7[0x80af616]
python2.7[0x80a928e]
python2.7[0x808e024]
python2.7[0x8067c5b]
python2.7[0x808c079]
python2.7(PyDict_SetItem+0x87)[0x808cfa7]
python2.7(_PyModule_Clear+0x123)[0x8090693]
python2.7(PyImport_Cleanup+0x175)[0x80f2ca5]
python2.7(Py_Finalize+0x10c)[0x80ffacc]
python2.7(Py_Main+0x53d)[0x8058c1d]
python2.7(main+0x1b)[0x805839b]
/lib/i686/nosegneg/libc.so.6(__libc_start_main+0xe6)[0xb75e2ce6]
python2.7[0x80582e1]
======= Memory map: ========
08048000-0817d000 r-xp 00000000 ca:00 430104 /home/michael/bin/python2.7
0817d000-081ab000 rw-p 00134000 ca:00 430104 /home/michael/bin/python2.7
081ab000-081b4000 rw-p 00000000 00:00 0
...
자주 발생하지만 항상 발생하는 것은 아닙니다. 또한, * .pyc 파일을 libsvm 하위 디렉토리에서 제거하면 실패없이 작동하는 것으로 보이지만 * .pyc 파일이 다시 생성되면 (처음 실행 한 후) 코어를 다시 덤프하는 경향이 있습니다.
또한 표준 오류를 파일에 파이프하면 오류가 발생하지 않습니다. 관련이있을 수
일부 정보는 :
- 그것은 단지 내가 파이썬 2.7 설치할 때 발생하기 시작했다. (CentOS는 대한 python2.7 패키지가없는 소스에서, 이후) 내 홈 디렉토리에 2.6
- Python2.7 설치 그것은 파이썬에서 일어나는되지 않은
는이 문제를 어떻게 접근해야 하는가? 문제가있는 곳은 어디입니까? libsvm 소스 또는 Python 래퍼에 있습니까? 필자는 파이썬 소스에없는 것이 확실합니다. 그런 식으로 인터프리터를 충돌해서는 안되기 때문입니다.
편집 나는 프로덕션 환경에 모델을 재교육하고 문제가 사라진 것으로 보인다. 참고로 여기에 사용하는 두 모델의 개발 환경과 생산 환경의 차이점이 있습니다.
헤더 DIFF 제 모델 :
4,7c4,7
< total_sv 8858
< rho -0.500251 -0.215012 2.99972 -0.00159202 0.000223509 1.00003
< label 3 2 1 0
< nr_sv 549 6095 587 1627
---
> total_sv 8782
> rho -2.99981 0.000329574 -1.00015 -0.335094 -0.999424 -0.66958
> label 0 3 2 1
> nr_sv 1586 535 6083 578
-bash-4.1$ diff model.svm model2.svm | head -n 20
4,7c4,7
< total_sv 8858
< rho -0.500251 -0.215012 2.99972 -0.00159202 0.000223509 1.00003
< label 3 2 1 0
< nr_sv 549 6095 587 1627
헤더 DIFF 번째 모델 :
4,7c4,7
< total_sv 116
< rho 2.30068 -0.145028 0.169511 -1.09344 0.723723 -0.865381
< label 3 0 2 1
< nr_sv 18 32 34 32
---
> total_sv 132
> rho 0.72381 -2.00473 -0.220492 -0.962109 0.998243 -0.14499
> label 0 1 3 2
> nr_sv 43 35 18 36
libsvm의'svm_free_model_content' 함수를 살펴보면 두 개의 가드가 있음을 알 수 있습니다.'if (model_ptr-> free_sv && model_ptr-> l> 0 && model_ptr-> 'svm_free_and_destroy_model'가 그 종류를 검사하기 때문에 NULL이 아닌'svm_model'이 실제로이 함수에 전달된다고 생각하게 만듭니다. (SV! = NULL)''and if (model_ptr-> sv_coef)'' 사물의. 충돌 이전에 예상되는 예상치를 얻었습니까 아니면 다른 곳에서 사고가 났을 가능성이 있습니까? –
또한 모델을 교육 할 때나 예측을 계산할 때이 충돌이 발생합니까? –
의견을 보내 주셔서 감사합니다. 귀하의 질문에 답하기 위해서 : 그것은 예측을 계산할 때만 발생합니다. 나는 충돌 이전에 예상되는 예측을 얻고있다. – misha