Как в 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;