Получение трассировки от Python C API - PullRequest
1 голос
/ 06 апреля 2010

У меня есть модуль расширения Python C API, который иногда падает с неинформативным «MemoryError». Это явно не ошибка, которая обрабатывается обработчиками исключений модуля. Как получить более информативную трассировку ошибок, чтобы я мог выяснить, что пошло не так в модуле расширения?

Возможно, вопрос должен быть задан, учитывая, что у меня есть исходный код модуля расширения, что я должен сделать, чтобы получить его отладочную версию с MSVC на MS Windows?

1 Ответ

2 голосов
/ 06 апреля 2010

Похоже, что модуль расширения утверждает, что ему не хватает памяти - правда это или ложь, конечно, невозможно определить, не глядя на источники расширения. На всякий случай, если это правда, так что нехватка памяти может помешать обратному отслеживанию, старый трюк состоит в том, чтобы получить немного памяти раньше и отбросить ее в случае ошибки, прежде чем ререйзировать ее, например:

reserve = [None] * 10000
try: amodule.somecall()
except MemoryError:
    del reserve
    raise

Это не скажет вам намного больше, чем то, какая Python-видимая функция вызвала ошибку (и какая функция Python ее назвала и т. Д.). Чтобы пойти дальше, вам нужно скомпилировать исходные коды расширения C для отладки и использовать некоторые инструменты, такие как gdb.

...