Как установить точку останова в функции python в gdb

Я иногда использую gdb для отладки скриптов Python (конечно, CPython). Обычно это полезно для отладки дампов ядра (и когда это касается модулей расширения c).

Основной вопрос заключается в том, как установить точку останова для функции Python в gdb. Скажем, у меня есть скрипт Python с функцией foo, и я хочу сломаться сразу после вызова foo. Я предполагаю, что установка условной точки останова на PyEval_EvalFrameEx может сработать, но не знаю, как это сделать.


person amit    schedule 09.01.2013    source источник


Ответы (1)


Используя предложенную вами технику, это работает (хотя это некрасиво):

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

Здесь f — объект PyFrameObject. Вы также можете проверить f->f_code->co_filename, чтобы убедиться, что у вас правильный файл. Обратите внимание, что это немного замедляет работу программы, так как вы много разбиваете и сравниваете.

В GDB 7 есть несколько хороших вспомогательных макросов для работы с CPython, но я с ними не знаком. Вероятно, есть более приятный способ добиться того, что вы ищете, с ними.

person Brendan Dolan-Gavitt    schedule 06.03.2013