Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Исключительные ситуации, ошибки


Автор: Avers 10.10.2008, 14:23
Есть интересная похожая тема
http://forum.vingrad.ru/topic-149106.html

Так вот попрос: как обратиться к Call Stack во время выполнения программы. 
Т.е. хотелось бы написать такую штуковину, которая работает с Call Stack во время выполнения приложения. Модуль бы такой состряпать.
Возможно ли это?

Автор: CodeMonkey 10.10.2008, 14:30
Берите готовый - например JclDebug из http://sourceforge.net/projects/jcl.

См. также:
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=57687.
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=58566.
http://www.delphikingdom.ru/asp/answer.asp?IDAnswer=58456.

Добавлено через 2 минуты и 55 секунд
Блин, в теме что вы указали, уже всё есть:

Цитата(dumb @  2.5.2007,  03:18 Найти цитируемый пост)
либо воспользоваться готовыми компонентами:
Цитата(Peter Below (TeamB))

Debugging helpers 
  madExcept: http://www.madshi.net/ 
  Exceptional Magic: http://dimus.virtualave.net/ 
  Stack tracer published in Delphi Magazine: http://www.thedelphimagazine.com/disks/dmag50.zip 
  JclDebug: http://delphi-jedi.org -> Code Library 
  DJMDebug 0.5: http://www.murdoch-sutherland.com/programs 
  EurekaLog: http://www.eurekalog.com

Автор: Avers 13.10.2008, 08:27
Спс)
Но дело вот в чем
Цитата

хотелось бы написать

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

Автор: CodeMonkey 13.10.2008, 09:14
Цитата(Avers @  13.10.2008,  08:27 Найти цитируемый пост)
Нужен более простой, написанный самостоятельно.

Перепишите JclDebug самостоятельно smile 
Если серьёзно, то нет никакого смысла этого делать. Но если вам уж ТАК хочется - просто возьмите нужные функции из модуля.
Кроме того, "простой" не получится написать по-любому. Дело в том, что вся отладочная информация идёт только из одного места: из текстовых .map-файлов, создаваемых линкёром. А это значит, что, чтобы получить текстовое имя по адресу, вам нужно будет как минимум написать парсер map-файлов. Это вам не как два пальца...

Автор: Avers 5.11.2008, 13:09
Но как минимум, имя процедуры в исключительной ситуации узнать все же можно:
Код

procedure TForm1.MyException(Sender: TObject; E: Exception);
var
  i: integer;
  s: string;
begin
  if copy(e.Message,1,6)='Access' then
    begin
      i := strtoint('0x'+copy(e.Message,Pos('address',e.Message)+8,8));
      s := '';
      repeat
        s := Self.MethodName(Pointer(i));
        dec(i,2);
      until (s<>'');
      ShowMessage(s);
    end;
end;


И ни каких парсеров писать не надо) 
Это собственно все, что было нужно.

Добавлено через 47 секунд
Достаточно "включить" DebugInfo

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)