>Для этого собираю файл с опцией -g Далее
Еще про -O1 забывать не надо, с оптимизацией стек может быть очень странным
>gdb fyle
>backtrace
>set logging file mylog.txt
>set logging on
>run
backtrace показывает стек в текущий момент времени, т.е. после run и остановке на точке останова с помощью backtrace можно посмотреть как вы сюда попали
>>Ещё есть отладчик valgrind в котором модуль callgrind по слухам умеет показывать дерево выполняемых функций
еще к нему есть морда kcachegrind - в ней можно это красивое дерево посмотреть. но valgrind только под линукс(( в винде из аналогичного есть AQTime - но он неумеет fpc, только delphi
>>Наверно вся проблема в том, что разработчики огибают gdb для нужд Pascal, а он создан для С. Скорее всего функционал появится, когда допилят дебагер прямо для Pascal.
проблема в том что для fpc нет качественных профилировщиков
>>Если это не сложно, то почему за два года, с момента последнего коммита, никто не заслал такой патч.
Это действительно не трудно. острой нужды не у кого грамотного не возникало. у тебя возникла, ждем патчи))
Насчет потоков хз, но имена вызывающих процедур там известны даже без стека - в начало всех процедур\функций вставляются их идентифицирующие "префикы" а LazProfiler меряет время между этими префиксами. Добавляй сюда построение дерева вызовов и экспорт этого дерева.
У меня руки сильно чесались, но fcl-passrc на тот момент не мог распарсить мои исходники, соответственно LazProfiler у меня не работал. При следующем обострении тяги к оптимизации попробую добавить.
зы. содержимое стека всегда можно получить используя только силы fpc, без отладчиков и профайлеров:
- Код: Выделить всё
...
uses ... lineinfo, ...
...
procedure myDumpAddr(Addr: Pointer;var f:system.text);
begin
try
WriteLn(f,BackTraceStrFunc(Addr));
except
writeLn(f,SysBackTraceStr(Addr));
end;
end;
procedure MyDumpExceptionBackTrace(var f:system.text);
var
FrameCount: integer;
Frames: PPointer;
FrameNumber:Integer;
begin
WriteLn(f,'Stack trace:');
myDumpAddr(ExceptAddr,f);
FrameCount:=ExceptFrameCount;
Frames:=ExceptFrames;
for FrameNumber := 0 to FrameCount-1 do
myDumpAddr(Frames[FrameNumber],f);
end;
еще можно AllowReuseOfLineInfoData:=false сделать, кэширование там криво сделано и при попадании в стек чужих адресов следующие свои уже не распознаются