Я работаю над очень крупным приложением, где периодически я хотел бы зарегистрировать ВЕСЬ стек вызовов вплоть до текущей точки выполнения (не на исключении). Идея здесь состоит в том, что я хочу карту точного пути выполнения кода, который привел меня до такой степени, что я. Я работал с madExcept, оснащенным вокруг с jclDebug и в то время как я могу получить часть стека вызовов, я, может казаться, не получаю КАЖДЫЙ метод/процедуру/вызов функции, который сделан в приложении обнаружиться в журнале.
Мне включили стековые фреймы, информацию об отладке, и т.д. включенную на проекте. Я даже пытался включить стековые фреймы на отдельных методах, которые не становились включенными в стек вызовов напрасно.
То, что я пытаюсь сделать даже возможный? Я действительно стараюсь не иметь необходимость добавить регистрирующийся код на всем протяжении наших миллионов строк кода для входа пути выполнения кода.
При возврате из метода он удаляется из стека. Таким образом, предположительно, ваш стек частичного вызова является каждым методом, который еще не возвращен?
например
DoSomething
begin
MiniSubMethod
DomeSomethingMore
begin
InnerDoSomething
begin
ShowCallStack
end
end
end
Я думаю, что в этой ситуации стек вызовов
InnerDoSomething
DoSomethingMore
DoSomething
MiniSubMethod больше не находится в стеке, так как он вернулся до вызова DoCoMore.
Я думаю, что FastMM4 включает трассировку стека, чтобы вы могли попробовать это.
Вам определенно понадобится какой-то журнал/трассировка стека вместо только стека вызовов.
Вы можете использовать madExcept - он включает метод с именем GetThreadStackTrace . MadExcept бесплатен для некоммерческого использования и, безусловно, стоит своих денег.
Для этого я использую 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, например:
Недавно я переключался между файлами JDBG, вставленными в EXE, чтобы просто отправлять внешние файлы JDBG, поскольку их было проще поддерживать.
Есть также подпрограммы, которые полезны для трассировки, такие как:
function ProcByLevel (Level: Integer): String;
Это позволяет вам определить текущее имя метода / процедуры, просматривая стек вызовов "N «количество уровней.
Если вам нужна полная трассировка, я считаю, что такой инструмент, как SmartInspect , может помочь вам в этом.
Это потребует от вас добавить логирование в ваш код, но для того, что вам нужно, это было бы неизбежно.
Мониторинг в реальном времени
Высокопроизводительное ведение журнала в реальном времени через TCP или именованные каналы к консолиНаблюдение и мониторинг ресурсов
Отслеживание значений переменных, данных сеанса и прочего ресурсы приложения.Rich Logging & Tracing
Отслеживайте сообщения, исключения, объекты, файлы, результаты базы данных и многое другое.
Судя по ответам и комментариям к другим ответам, похоже, что вам нужен ЖУРНАЛ ВЫЗОВОВ, а не СТЕК ВЫЗОВОВ. Нужная информация просто отсутствует в стеке вызовов.
В этом случае я предлагаю вам изучить такой инструмент, как SmartInspect или AQ Time . Я думаю, что из двух наиболее актуальным будет SmartInspect. AQ Time - это больше интерактивный инструмент профилирования, тогда как SmartInspect имеет средства специально для удаленной проверки.