2013-03-14 2 views
4

내 개발 환경 (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 
+0

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)'' 사물의. 충돌 이전에 예상되는 예상치를 얻었습니까 아니면 다른 곳에서 사고가 났을 가능성이 있습니까? –

+0

또한 모델을 교육 할 때나 예측을 계산할 때이 충돌이 발생합니까? –

+0

의견을 보내 주셔서 감사합니다. 귀하의 질문에 답하기 위해서 : 그것은 예측을 계산할 때만 발생합니다. 나는 충돌 이전에 예상되는 예측을 얻고있다. – misha

답변

3

오류의 원인 svm_load_model에서 초기화 포인터 및 free에 체크 호출이다. 패치는 다음과 같습니다.

[email protected]:~$ diff libsvm-3.16/svm.cpp.original libsvm-3.16/svm.cpp -p 
*** libsvm-3.16/svm.cpp.original  2013-03-17 17:34:00.235661297 +0900 
--- libsvm-3.16/svm.cpp 2013-03-17 17:39:29.677294903 +0900 
*************** svm_model *svm_load_model(const char *mo 
*** 2747,2752 **** 
--- 2747,2753 ---- 
     model->probB = NULL; 
     model->label = NULL; 
     model->nSV = NULL; 
+  model->sv_indices = NULL; 

     char cmd[81]; 
     while(1) 
*************** void svm_free_model_content(svm_model* m 
*** 2973,2980 **** 
     free(model_ptr->probB); 
     model_ptr->probB= NULL; 

!  free(model_ptr->sv_indices); 
!  model_ptr->sv_indices = NULL; 

     free(model_ptr->nSV); 
     model_ptr->nSV = NULL; 
--- 2974,2984 ---- 
     free(model_ptr->probB); 
     model_ptr->probB= NULL; 

!  if (model_ptr->sv_indices) 
!  { 
!   free(model_ptr->sv_indices); 
!   model_ptr->sv_indices = NULL; 
!  } 

     free(model_ptr->nSV); 
     model_ptr->nSV = NULL; 

저자에게 통보했습니다. 그들은 문제를 알고 있으며 다음 버전에서이를 해결할 것입니다.

+1

+1; 불행히도 LibSVM은 이런 종류의 버그로 가득차 있습니다. –

+0

글쎄, 도서관의 저자들이 당신을 도울 수있어 기쁘다. 내가 그들의 도움을 청하면 영원히 걸렸다. 불행하게도, libsvm은 생산 등급 코드에 대한 경험이 거의없는 연구자들에 의해 유지되고 있습니다. –

+0

그들은 내 의견으로는 비교적 잘하고 있습니다. 내 유일한 소원은 github.com에서 git repo로 공유하는 것처럼 소스로 더 개방적 일 수 있다는 것입니다. 그들이 개발 부문을 공유한다면, 이와 같은 문제는 그리 큰 고통을 초래하지 않을 것입니다. – misha