2014-04-29 14 views
6

Musimy dowiedzieć się, czy nasz kod działa pod kodem wykonywalnym CPython zbudowanym z włączonym debugowaniem, programowo. Moduł sys wydawał się nie mieć żadnych informacji, przynajmniej na python3.4-dbg Ubuntu 14.04. sys.flags.debug jest ustawiona na 0. Powodem tego jest to, że nasz kod niezmodyfikowany faktycznie powoduje awarię wersji debugowania Pythona. Aktualizacja: konkretnie kod ulega awarii wraz z błędem potwierdzenia po stronie C.Jak sprawdzić, czy plik wykonywalny CPython jest wersją debugowania w pythonie?

Z pewnością musi być coś lepszego niż zobaczenie, czy 'd' in sys.executable.

Odpowiedz

9

Poniższy kod może być to, co jesteś po

Korzystanie python3.4:

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

Z drugiej strony za pomocą python3.4-dbg:

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

Jednak są też skompilować opcje czasowe kontrolujące zachowanie "debugowania", takie jak NDEBUG menti tutaj: http://bugs.python.org/issue17411.

Innymi słowy: chociaż Py_DEBUG może być unieważniony (0), kod C-Code, który jest kontrolowany przez NDEBUG, może nadal zmieniać zachowanie Pythona. Ustawienie Py_DEBUG zawsze usuwa NDEBUG, powodując zastosowanie przydziałów. Brak Py_DEBUG nie ma wpływu na NDEBUG - może on być zdefiniowany lub nie. Jeśli zdefiniowano NDEBUG, asserts zostanie zdefiniowane jako puste makro.

Od http://en.wikipedia.org/wiki/Assert.h:

Programiści może wyeliminować twierdzeń tylko przez rekompilacji programu , bez zmiany kodu źródłowego: jeśli makro NDEBUG jest zdefiniowane przed włączeniem, na assert() makro jest definiowana jako:

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

możliwe, ale nieprzenośne, rozwiązaniem byłoby sprawdzić wiersza poleceń kompilatora OPT na to:

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

gdzie OPT może być na przykład

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

Wow, nie wiedziałem o tym. +1 – vaultah

+1

Jest to jeden z powodów, dla których nienawidzę twierdzeń o C - ktoś wiedział, że coś może pójść nie tak, ale zamiast obsługiwać go, wybrał opcję testowania go ** tylko w kompilacjach debugowania **, a rzeczy mogą trafić do piekła w dostarczanym pliku code - * (rant over, śledziona wentylacja)! * –

+0

Niepowtarzalny tak, ale przynajmniej działa na prawdziwych systemach operacyjnych, nie wiedział o Py_DEBUG i NDEBUG w sysconfig lub ich znaczeniach, dziękuję. –

Powiązane problemy