2012-02-20 3 views
0

여기 파이썬 멍청한 놈이 있습니다 (C에서는 녹슬 었습니다).Debug crashing C 파이썬 프로젝트에서 사용 된 라이브러리

저는 Mac 용 Lion OS를 사용하고 있습니다. libUSB를 사용하는 USBpy를 사용하는 NFCpy를 사용하려고합니다. libUSB는 null 포인터로 인해 충돌이 발생하지만, 너무 많은 부분이 관련되어 있기 때문에 디버깅하는 방법을 모릅니다.

지금 xcode를 사용하여 강조 표시된 코드를 볼 수 있지만 bash에서 모든 것을 실행합니다. Windows 또는 Linux로 전환 할 수 있습니다. 다른 환경에서는이 방법이 더 쉽습니다. 이 문제를 디버깅하는 방법에 대한

어떤 제안이 많은 ;-)

PS를 감상 할 수있다 : 나는 파이썬 스크립트를 실행 나는 bash는 C에 넣어 인쇄를 볼 수 있다면 그것은 잘 될 것

+0

시도 :

어쨌든, 당신은 당신의 소프트웨어를 사용하여 GDB를 디버깅 할 수 있습니다. –

답변

1

귀하의 터미널에 C에 넣은 printf()이 표시되어야합니다. 이미 여기에 잘못된 것이 있습니다. 최신 컴파일 된 라이브러리를 사용하고 있습니까? 확실하게 인쇄 대신에 assert(0)을 사용할 수 있습니다 (assert.h를 포함해야합니다). 당신의`c` 코드를 분리하고 디버깅 할 수있는 테스트 프로그램을 만들 수

gdb --args python yourfile.py 

# type "run" to start the program 
# if you put assert() in your code, gdb will stop at the assert, or you can put 
# manual breakpoint by using "b filename:lineno" before "run" 
+0

당신은 옳았습니다. 최신 컴파일 된 lib를 사용하지 않았습니다. 감사 :-) – momo

1

코어 덤프 (ulimit -Sc 무제한)를 활성화하고 프로그램을 중단하여 코어 파일을 생성하십시오. 충돌로 이어지는 조건에 대해 자세히 알아 보려면 gdb로 코어 파일을 검토하십시오. 호출 스택의 함수와 로컬 변수에서 단서를 찾아보십시오.

또는 gdb에서 프로그램을 실행하고 충돌이 발생하고 gdb가 신호 (SIGSEGV, SIGBUS 등)를 가로 챈 다음 실제 프로세스를 검사합니다.

모든 관련 원시 코드 (Python, libUSB 등)가 디버깅 심볼을 사용할 수 있도록하려면이 두 가지 방법이 더 쉬울 것입니다.

티오 (Tio)가 제안한대로 프로그램에서 문제를 격리 시키면이 과정을 더 쉽게 수행 할 수 있습니다.

PS : 나는 내가 파이썬 스크립트를 실행하는 bash는 C에 넣어 인쇄를 볼 수 있다면 그것은 잘 될 것

당신은 C에서 "인쇄 추가에 대해 아무것도 언급하지 않았다 "귀하의 질문에 다른 곳에서. 디버깅 프린트를 추가하기 위해 libUSB를 수정 했습니까? 그렇다면 재건축 했습니까? 이전에 사용했던 libUSB 대신 새 빌드를 사용하기 위해 어떤 단계를 밟았습니까? 동적 링커가 시스템 버전보다 버전을 선호하게하려면 dylib 관련 환경 변수를 조정해야 할 수도 있습니다. 당신이 다른 일을했다면 무엇을 설명하십시오. :)