Как в Delphi получить StackTrace не вызывая исключение?

Поиск жёстко ассоциирует трассировку с обработкой ошибок. Мне нужно просто для исследования, поэтому временно сделал примерно такой костыль:

  try
    raise Exception.Create('TD05_055: Нехорошие бурки вызывают AsDouble от TUint64Cell, надо понять кто: ');
  except on E: Exception do
    TSDLog.Error(E.Message + sLineBreak + E.StackTrace);
  end;

Есть ли более легитимный способ получить стек вызовов?


Ответы (1 шт):

Автор решения: Solt

Можно WinAPI использовать, например RtlCaptureStackBackTrace, но понадобится настраивать символы и сработает только в винде (хотя где ещё Delphi применять). А можно либу JCL прикрутить. Вот пример из какой-то доки:

uses
  JclDebug;

function GetStackTrace: string;
var
  StackInfo: TJclStackInfoList;
  I: Integer;
begin
  Result := '';
  // Исключаем себя из стека (если нужно)
  StackInfo := JclCreateStackList(False, 1, nil);
  try
    for I := 0 to StackInfo.Count - 1 do
      Result := Result + StackInfo.Items[I].CalledFromAddress.ToString + ' -> ' + StackInfo.Items[I].FunctionName + sLineBreak;
  finally
    StackInfo.Free;
  end;
end;
→ Ссылка