Нужен способ периодически зарегистрировать стек вызовов / отслеживание стека для КАЖДОГО названного метода/процедуры/функции

Я работаю над очень крупным приложением, где периодически я хотел бы зарегистрировать ВЕСЬ стек вызовов вплоть до текущей точки выполнения (не на исключении). Идея здесь состоит в том, что я хочу карту точного пути выполнения кода, который привел меня до такой степени, что я. Я работал с madExcept, оснащенным вокруг с jclDebug и в то время как я могу получить часть стека вызовов, я, может казаться, не получаю КАЖДЫЙ метод/процедуру/вызов функции, который сделан в приложении обнаружиться в журнале.

Мне включили стековые фреймы, информацию об отладке, и т.д. включенную на проекте. Я даже пытался включить стековые фреймы на отдельных методах, которые не становились включенными в стек вызовов напрасно.

То, что я пытаюсь сделать даже возможный? Я действительно стараюсь не иметь необходимость добавить регистрирующийся код на всем протяжении наших миллионов строк кода для входа пути выполнения кода.

13
задан dsolimano 26 July 2011 в 19:59
поделиться

5 ответов

При возврате из метода он удаляется из стека. Таким образом, предположительно, ваш стек частичного вызова является каждым методом, который еще не возвращен?

например

DoSomething
begin
    MiniSubMethod
    DomeSomethingMore
    begin
        InnerDoSomething
        begin
            ShowCallStack
        end
    end
end

Я думаю, что в этой ситуации стек вызовов

InnerDoSomething  
DoSomethingMore  
DoSomething  

MiniSubMethod больше не находится в стеке, так как он вернулся до вызова DoCoMore.

Я думаю, что FastMM4 включает трассировку стека, чтобы вы могли попробовать это.

Вам определенно понадобится какой-то журнал/трассировка стека вместо только стека вызовов.

6
ответ дан 1 December 2019 в 17:58
поделиться

Вы можете использовать madExcept - он включает метод с именем GetThreadStackTrace . MadExcept бесплатен для некоммерческого использования и, безусловно, стоит своих денег.

7
ответ дан 1 December 2019 в 17:58
поделиться

Для этого я использую 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 (созданные из файлов MAP)
  • Файлы JBDG, вставленные в EXE.

Недавно я переключался между файлами JDBG, вставленными в EXE, чтобы просто отправлять внешние файлы JDBG, поскольку их было проще поддерживать.

Есть также подпрограммы, которые полезны для трассировки, такие как:

function ProcByLevel (Level: Integer): String;

Это позволяет вам определить текущее имя метода / процедуры, просматривая стек вызовов "N «количество уровней.

23
ответ дан 1 December 2019 в 17:58
поделиться

Если вам нужна полная трассировка, я считаю, что такой инструмент, как SmartInspect , может помочь вам в этом.

Это потребует от вас добавить логирование в ваш код, но для того, что вам нужно, это было бы неизбежно.

Некоторые из его основных моментов

Мониторинг в реальном времени
Высокопроизводительное ведение журнала в реальном времени через TCP или именованные каналы к консоли

Наблюдение и мониторинг ресурсов
Отслеживание значений переменных, данных сеанса и прочего ресурсы приложения.

Rich Logging & Tracing
Отслеживайте сообщения, исключения, объекты, файлы, результаты базы данных и многое другое.

1
ответ дан 1 December 2019 в 17:58
поделиться

Судя по ответам и комментариям к другим ответам, похоже, что вам нужен ЖУРНАЛ ВЫЗОВОВ, а не СТЕК ВЫЗОВОВ. Нужная информация просто отсутствует в стеке вызовов.

В этом случае я предлагаю вам изучить такой инструмент, как SmartInspect или AQ Time . Я думаю, что из двух наиболее актуальным будет SmartInspect. AQ Time - это больше интерактивный инструмент профилирования, тогда как SmartInspect имеет средства специально для удаленной проверки.

7
ответ дан 1 December 2019 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: