Я хотел бы извлечь стек из трещащих приложений с большими отпечатками памяти. В идеале пользователю не нужно ждать, пока весь файл coredump будет записан на диск.Является ли исполняемый и связанный формат (ELF) доступным?
Мое настоящее мышление заключается в установке крюка coredump на /proc/sys/kernel/core_pattern
, который будет анализировать входящий coredump через stdin и извлекать только стек. Но создание полной копии coredump в памяти было бы непрактичным, поэтому потоковый подход был бы лучше.
Я новичок в формате ELF (http://en.wikipedia.org/wiki/Executable_and_Linkable_Format) и задавался вопросом, может ли он поддерживать потоковый синтаксический анализатор. Я еще не написал потоковый анализатор любого типа - я знаком с концепцией, но мне нужны указатели на то, как анализировать формат потоков.
В качестве первой попытки, я попробовал:
cat core | readelf -a
Но, это не похоже, readelf поддерживает ввод из стандартного ввода.
Я также нашел этот питон эльфа парсер, но это кажется на первый взгляд, как он читает весь эльфа в память: https://github.com/eliben/pyelftools
Но, в случае необходимости, может быть, я мог бы использовать их реализацию в качестве ссылки для потокового парсера ,
Спасибо!
Обратите внимание, что найденное решение backtrace будет работать только для 32-разрядных двоичных файлов, а только для тех, которые были скомпилированы без оптимизации, или со старыми версиями GCC. –
@EmployedRussian - можете ли вы предоставить более подробную информацию о том, почему это не будет работать для 64-битного? – matthewatabet
@matthewtablet код backtracestack использует указатели на фреймы, которые по умолчанию отключены на 'x86_64' с оптимизацией. Используя новые версии GCC, указатели на рамки также отключены с оптимизацией на 'ix86' (32-разрядной). Разматывание без указателей рамки намного сложнее; вам нужно что-то вроде libunwind. –