2012-08-15 3 views
2

나는 심각하게 몇 달을 보냈다는 문제가있다!코드를 실행할 때 Python이 드문 경우에 충돌이 발생합니다. 디버깅 방법은 무엇입니까?

기본적으로 HD5 파일을 읽고 HD5 파일에 저장해야하는 코드를 실행하고 있습니다. 나는 이것을 위해 h5py를 사용하고있다.

문제가 (어떤 것이 든) 문제의 5 % (각각의 실행은 몇 시간이 걸립니다)에서만 발생하기 때문에 디버그하기가 매우 어렵습니다. 그리고 거기에 도달하면 파이썬이 완전히 충돌하므로 파이썬 자체로 디버깅하는 것이 불가능합니다. 단순한 로그를 사용하면 정확한 충돌 상황을 정확히 찾아내는 것이 불가능합니다. 코드가 다른 점에서 충돌하거나 지연되는 경우가 매우 무작위 적으로 나타납니다.

나는 일이 뭐죠 알아낼 올리 디버그를 사용하여 시도하고 안전하게 지속적으로 다음 위치에서 충돌이 있다는 결론을 내릴 수있다 : 액세스 위반 오류 메시지와 함께, 곧 파이썬 기본 PyObject_ClearWeakRefs를 호출 한 후 http://i.imgur.com/c4X5W.png image

것 같다 . 이상한 것은 파일이 성공적으로 기록되었다는 것입니다. 무엇이 액세스 위반 오류가 발생합니까? 아니면 파이썬 내부 (예 : 스택?) 파일이 아닌 (즉, 내 코드) 내부입니까?

아이디어가 있습니까? 그렇지 않다면 정확히 어떤 일이 일어나는지보다 똑똑한 방법으로 발견 할 수 있습니까? 어쩌면 일부 숨겨진 파이썬 로그 또는 내가 모르는 뭔가? 감사합니다.

+0

어떤 OS입니까? 정확한 오류 메시지 란 무엇입니까? (예를 들어 세분화 오류입니까?) – mgilson

+1

자신 만의 로그를 만들 수 있습니다. 파이썬에는 많은 로깅 모듈, 예를 들어 http://docs.python.org/library/logging.html이 있습니다. 그런 다음 모든 로그에 로깅을 삽입 할 수 있습니다. 코드 (일부 회사 나 다른 회사의 심각한 코드 인 경우 어쨌든 똑똑 할 것입니다) - 또한 - 코드를 작은 덩어리로 분리하여 다른 부분을 더 쉽게 확인할 수 있도록해야합니다. 함수를 통해 변수를 전달하는 대신 파일을 쓰고 읽은 다음 오류가 발생하면 중단 한 부분부터 다시 시작할 수 있습니다. –

+0

감사합니다. 내 코드를 작은 덩어리로 분할하고 로깅을 포함 시켰습니다. 그러나 불행히도 충돌은 매우 무작위입니다.로거는 매번 다른 시점에서 발생하기 때문에 좋은 통찰력을주지 못합니다. 그러나 디버거의 디버그 출력은 일관성이 있습니다. 따라서 정직과 관련된 하드웨어가 아니라고 생각합니다. OS는 python 2.7.2가 설치된 Windows 7입니다. python이 충돌하기 때문에 오류 메시지는 없습니다. 내가 접근 할 수 있었던 가장 가까운 것은 접근 위반 오류 (스크린 샷 참조)를 암시하는 것으로 보이는 OllyDbg 출력이었습니다 – Muppet

답변

1

모든 답변 주셔서 감사합니다. 이번에는 두 개의 버전을 실행했습니다. 하나는 새로운 Python 설치 프로그램이고 다른 하나는 원래 컴퓨터/설치 프로그램 이었지만 다른 모든 HDF5 읽기/쓰기 절차는 numpy 읽기/쓰기 프로 시저로 대체했습니다.

프로그램이 이상한 시간에 두 번째 컴퓨터에서 계속 충돌했지만 내 기본 컴퓨터에서 변경된 코드로 인해 충돌이 없었습니다. 나는 HDF5 이상, 특히 h5py와 관련이 있다고 결론을 내리는 것이 안전하다고 생각합니다. 더 많은 사람들이 그 점에서 h5py와 관련된 문제를 겪었던 것으로 보입니다. 내 응용 프로그램의 오류가 잠재적으로 큰 재정적 손실로 이어지는 것을 감안할 때 다른 안정적인 솔루션을 위해 HDF5를 완전히 폐기하기로 결정했습니다.

1

PyObject_ClearWeakRefs은 파이썬 인터프리터 자체에 있습니다. 그러나 실행 횟수가 적은 경우에만 하드웨어와 관련 될 수 있습니다. 시도 할 수있는 것 :

  • 다른 컴퓨터에서 프로그램을 실행하십시오. 충돌이 없다면 아마 하드웨어 문제 일 것입니다.
  • 설치된 버전이 어떻게 든 손상된 경우를 대비하여 Python을 다시 설치하십시오.
  • 메모리 테스트 프로그램을 실행하십시오.
+0

어떤 종류의 메모리 테스트 프로그램을 권하고 싶습니까? 왜 기억이 이것에 영향을 줄 수 있다고 생각하니? – Muppet

+0

제 경험상 간헐적 인 충돌은 종종 하드웨어와 관련이 있습니다. 예 : 전원 공급 장치 전압 또는 CPU 온도가 전체 시스템을 정지 시키지만 RAM 오류는 개별 프로그램에 영향을 줄 수 있습니다. 가장 악명 높은 신호는 다음과 같습니다. 좋은 메모리 테스트 프로그램은 memtest86 +입니다. http://www.memtest.org/ –

+0

안녕하세요 롤랜드, 나는 앞뒤로 가고 memtest86 + 4.2를 사용했고 약 1.5 시간 후에 오류없이 한 번 통과했습니다. =/디버깅 출력이 도움이된다고 생각합니까? 나는 그것이 h5py 또는 스레드 관련일지도 모른다고 느낀다. – Muppet

-2

try catch 문을 사용하십시오. 이것은 잘못된 데이터가 입력되었을 때 프로그램이 충돌하는 것을 막기 위해 프로그램에 넣을 수 있습니다.