Трассировка стека под Linux
Добавлено: 12.03.2010 12:20:27
Всем доброго времени суток!
Есть готовый трассировщик, отлично работающий под Delphi.
Работать он может двумя методами — проходом по фреймам, и raw-трассировкой.
Используется на обработчике exception-ов, для выяснения где именно эти исключения происходят.
Проблема в том, что ни один из двух методов не работает в FPC+Linux.
1. При трассировке методом обхода стек-фреймов падает с общесистемной ошибкой (защита памяти?)
Тут совсем не шарю. Каким образом FPC генерит стековые фреймы?
2. Трассировку raw-методом нельзя реализовать, поскольку для этого надо узнать диапазон
адресов в котором размещается программный код.
Если просто для Линукса что-то гуглится, то под FPC инфу не найти.
А если учесть, что я не линуксоид, то сия задача для меня становится крайне затруднительной.
Подскажите, в какую сторону гуглить?
Добавлено спустя 12 минут 10 секунд:
Нагуглил некую backtracestrfunc.
Я так понимаю, они использует первый метод.
И возвращает строку..... Есть ли способ ее отформатировать? Неужели парсить надо?
Забыл сказать, что нужны только адреса. Резолв этих адресов делается уже после — отдельной утилитой.
И получается, чтоб резолвить эти адреса под линуксом, нужно все-равно знать базовый адрес куда загрузчик размещает код
Есть готовый трассировщик, отлично работающий под Delphi.
Работать он может двумя методами — проходом по фреймам, и raw-трассировкой.
Используется на обработчике exception-ов, для выяснения где именно эти исключения происходят.
Проблема в том, что ни один из двух методов не работает в FPC+Linux.
1. При трассировке методом обхода стек-фреймов падает с общесистемной ошибкой (защита памяти?)
- Код: Выделить всё
function FillCallStack(var ST: TCallStack; LevelsToExclude: integer = 5): integer;
var
Count: integer;
SkipCount: integer;
StackMax: Pointer;
StackStart: Pointer;
CurrentFrame: Pointer;
begin
FillChar(ST, SizeOf(ST), 0);
asm
mov EAX, FS:[4] <<<<---- Тут sigsegv
mov StackMax, EAX
mov StackStart, EBP
end;
Тут совсем не шарю. Каким образом FPC генерит стековые фреймы?
2. Трассировку raw-методом нельзя реализовать, поскольку для этого надо узнать диапазон
адресов в котором размещается программный код.
Если просто для Линукса что-то гуглится, то под FPC инфу не найти.
А если учесть, что я не линуксоид, то сия задача для меня становится крайне затруднительной.
Подскажите, в какую сторону гуглить?
Добавлено спустя 12 минут 10 секунд:
Нагуглил некую backtracestrfunc.
Я так понимаю, они использует первый метод.
И возвращает строку..... Есть ли способ ее отформатировать? Неужели парсить надо?
Забыл сказать, что нужны только адреса. Резолв этих адресов делается уже после — отдельной утилитой.
И получается, чтоб резолвить эти адреса под линуксом, нужно все-равно знать базовый адрес куда загрузчик размещает код