2014-04-29 1 views
6

프로그래밍 방식으로 디버깅을 사용하여 빌드 된 CPython 실행 파일에서 코드가 실행되는지 확인해야합니다. sys 모듈에는 적어도 우분투 14.04의 python3.4-dbg에 대한 정보가없는 것으로 보입니다. sys.flags.debug은 0으로 설정됩니다.이 이유는 수정되지 않은 코드가 실제로 파이썬의 디버그 버전을 충돌시키는 것입니다. 업데이트 : 특히 코드가 C 측의 어설 션 오류로 인해 충돌합니다.파이썬에서 CPython 실행 파일이 디버그 버전인지 어떻게 알 수 있습니까?

'd' in sys.executable 인 경우 반드시 확인해야합니다.

python3.4 사용 후

답변

9

다음 코드는있는 무슨 수 있습니다 : 한편

>>> import sysconfig 
>>> sysconfig.get_config_var('Py_DEBUG') 
0 

python3.4-dbg를 사용하여 :

>>> import sysconfig 
>>> sysconfig.get_config_var('Py_DEBUG') 
1 

을하지만,도 컴파일된다 NDEBUG menti와 같은 "디버그"동작을 제어하는 ​​시간 옵션 oned 여기 : http://bugs.python.org/issue17411.

다른 말로하면 : Py_DEBUG이 설정되지 않았을 수도 있지만 (NDEBUG에 의해 제어되는 C 코드 어설 션은 여전히 ​​파이썬의 동작을 변경시킬 수 있습니다. Py_DEBUG을 설정하면 항상 NDEBUG이 해제되어 어설 션이 적용됩니다. Py_DEBUG의 부족은 NDEBUG에 영향을 미치지 않습니다. 정의되어 있거나 정의되지 않았을 수 있습니다. NDEBUG이 정의되면 어설 션은 void 매크로로 정의됩니다. http://en.wikipedia.org/wiki/Assert.h에서

:

이 그냥 소스 코드를 변경하지 않고 프로그램을 재 컴파일하여 주장을 제거 할 수

프로그래머

: 매크로 NDEBUG가 어설의 포함 전에 정의 경우() 매크로 입니다 정의 단순히 :

#define assert(ignore)((void) 0) 

가능한하지만, 인자를 취하지 솔루션은 컴파일러 명령 줄 0,123,827을 확인하는 것입니다 이것에 대한는 : OPT 예를

>>> sysconfig.get_config_var('OPT') 
'-DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes' 
+0

와우이 될 수

>>> '-DNDEBUG' not in (sysconfig.get_config_var('OPT') or '') 

, 알고하지 않았다. +1 – vaultah

+1

이것이 내가 C 주장을 싫어하는 이유 중 하나입니다. 누군가가 잘못 될 수 있다는 것을 알고 있지만, 처리하기보다는 처리하기 위해 디버그 빌드에서 ** 단지 물건을 지옥으로 보낼 수 있습니다. 코드 예 - * (호언 장담, 비장 발사)! * –

+0

이식 할 수 없지만 적어도 실제 운영체제에서 작동하며 sysconfig의 Py_DEBUG와 NDEBUG 또는 그 의미에 대해 몰랐습니다. 감사합니다. –

관련 문제