Я использую JCLDebug из JCL , чтобы сделать это.
Следующая команда получит стек вызовов для текущего местоположения и вернет его в виде строки.
function GetCurrentStack: string;
var
stackList: TJclStackInfoList; //JclDebug.pas
sl: TStringList;
begin
stackList := JclCreateStackList(False, 0, Caller(0, False));
sl := TStringList.Create;
stackList.AddToStrings(sl, True, True, True, True);
Result := sl.Text;
sl.Free;
stacklist.Free;
end;
Чтобы эта работа работала должным образом, необходимо включить один из поддерживаемых способов отладочной информации для JCL, например:
- Turbo Debugger Information
- Файлы JDBG (сгенерированные из файлов MAP)
- Файлы JBDG, вставленные в EXE.
Недавно я переключился между файлами JDBG, вставленными в EXE, чтобы просто отправлять внешние файлы JDBG, поскольку их было проще поддерживать.
Есть также подпрограммы, которые полезны для трассировки, такие как:
function ProcByLevel(Level : Integer) : String;
Это позволяет вам определить текущее имя метода / процедуры, оглядываясь назад в стеке вызовов "N" количество уровней.