Доступ к объектам Python в основном дампе

Есть ли в любом случае, чтобы обнаружить значение Python PyObject* из corefile в GDB

1 ответ

Решение

Это много работы, но, конечно, это можно сделать, особенно если у вас есть все символы. Посмотрите на заголовочные файлы для конкретной версии Python (и используемых для ее сборки параметров компиляции): они определяют PyObject как структуру, которая включает, в первую очередь, указатель на тип. Используется множество макросов, поэтому вы можете захотеть снова запустить компиляцию этого Python из исходных кодов, с точно такими же флагами, но в дополнение к -E, чтобы остановить после предварительной обработки, чтобы вы могли обратиться к конкретному коду C, который сделал биты вы видите в основной дамп.

Объект типа имеет, помимо прочего, строку (массив char), которая является его именем, и по нему вы можете определить, что именно содержат объекты этого типа - будь то содержимое напрямую или, возможно, некоторое содержимое (например, длина). число элементов) и указатель на фактические данные.

Я сделал такую ​​сверхсложную посмертную отладку пару раз (начиная с ОЧЕНЬ точного знания задействованных версий Python и всех подготовленных предварительно обработанных источников и т. Д.), И каждый раз это занимало у меня день или два (если я еще Фриланс и оплата за час, если бы мне пришлось делать ставку на такую ​​задачу, я бы сказал, по крайней мере, 20 часов - по моим недешевым почасовым тарифам!-).

Я хочу, чтобы это того стоило, только если это действительно единственный выход из очень дорогого маринада. С положительной стороны, он научит вас больше о внутренностях Python, чем вы когда-либо думали, даже после запоминания каждой строки источников. Удачи вам понадобится!!!

Другие вопросы по тегам