Delphi JCL Отладка отсутствующих записей фрейма стека для JDBG

Я использую следующий код для вывода кадра стека в момент исключения:

...
var
  FTraceList: TStringList;
...
procedure TTraceForm.LogException(ExceptObj: TObject; ExceptAddr: Pointer; IsOS: Boolean);
begin
...
StackList := JclCreateStackList(false, 0, Caller(0, false));
try
  FTraceList.Add('');
  FTraceList.Add('Stack trace at the moment of the exception:');
  StackList.AddToStrings(FTraceList, true, true, true, true);
finally
  Stacklist.Free;
end;
end;

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

Для намеченного исключения (исключение для целей тестирования) в OnKeyDown основной формы при компиляции в режиме отладки (информация отладки Delphi) результат:

Stack trace at the moment of the exception:
(00591276){Main.exe     } [00992276] DlgTraceException.TTraceForm.LogException (Line 162, "DlgTraceException.pas" + 55) + $4
(0058B8FF){Main.exe     } [0098C8FF] JclDebug.JclCreateStackList + $17
(00591281){Main.exe     } [00992281] DlgTraceException.TTraceForm.LogException (Line 162, "DlgTraceException.pas" + 55) + $F
(00582AE3){Main.exe     } [00983AE3] JclHookExcept.TNotifierItem.DoNotify + $43
(00582CCB){Main.exe     } [00983CCB] JclHookExcept.DoExceptNotify + $CF
(00582DAD){Main.exe     } [00983DAD] JclHookExcept.HookedExceptObjProc + $1D
(0000606F){Main.exe     } [0040706F] System.@HandleAnyException + $33
(00598DE3){Main.exe     } [00999DE3] Main.TMainForm.FormKeyDown (Line 658, "Main.pas" + 2) + $7

И это я получаю в режиме Release (информация об отладке JCL добавляется в двоичный файл с помощью JCL Debug Expert):

Stack trace at the moment of the exception:
(0053BA27){Main.exe     } [0093CA27] DlgTraceException.TTraceForm.LogException + $377
(00536427){Main.exe     } [00937427] JclDebug.JclCreateStackList + $17
(0053BA32){Main.exe     } [0093CA32] DlgTraceException.TTraceForm.LogException + $382
(0052D60B){Main.exe     } [0092E60B] JclHookExcept.TNotifierItem.DoNotify + $43
(0052D7F3){Main.exe     } [0092E7F3] JclHookExcept.DoExceptNotify + $CF
(0052D8D5){Main.exe     } [0092E8D5] JclHookExcept.HookedExceptObjProc + $1D
(0000606F){Main.exe     } [0040706F] System.@HandleAnyException + $33

Во втором случае запись FormKeyDown отсутствует. Есть кто-то, кто знает, почему это происходит? Я хотел бы также узнать всю трассировку стека в режиме выпуска.

1 ответ

Решение

Немного поиграв с опциями компилятора (включив и выключив их), я смог выделить причину. Кадр стека был оптимизирован. Когда я выключил Оптимизацию, вызов FormKeyDown записывался даже в режиме Release. Опция генерации стековых фреймов, упомянутая в комментариях выше, не повлияла на результаты.

Конечно, я буду держать оптимизации в режиме релиза. Будет сложнее найти причину исключения, но есть и другая информация о ней, предоставляемая отладкой JCL, которая (надеюсь) должна быть достаточной для поиска причины исключения.

Другие вопросы по тегам