2013-01-09 9 views
5

Czasami używam gdb do debugowania skryptów Pythona (oczywiście CPython). Zazwyczaj jest to przydatne do debugowania zrzutów pamięci (i gdy dotyczy to modułów rozszerzenia c).Jak ustawić punkt przerwania na funkcji Pythona w gdb

Podstawowe pytanie brzmi: jak ustawić punkt przerwania na funkcji Pythona w gdb. Powiedzmy, że mam skrypt Pythona z funkcją foo i chcę zerwać zaraz po wywołaniu foo. Domyślam się, że ustawienie warunkowego punktu przerwania na PyEval_EvalFrameEx może działać, ale nie wiem, jak to zrobić.

Odpowiedz

1

Stosując technikę zasugerował, to działa (choć nie całkiem):

break PyEval_EvalFrameEx if (strcmp((((PyStringObject *)(f->f_code->co_name))->ob_sval), "foo") == 0) 

Tutaj f jest PyFrameObject. Możesz również sprawdzić numer f->f_code->co_filename, aby upewnić się, że masz właściwy plik. Zauważ, że to trochę spowalnia program, ponieważ bardzo często się załamujesz i porównujesz.

GDB 7 ma kilka ładnych makr pomocniczych do obsługi CPython, ale nie jestem do nich zaznajomiony. Prawdopodobnie istnieje lepszy sposób na osiągnięcie tego, czego szukasz z tymi.