Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Хочу получить диагностику ошибкин

Автор: andriano 18.12.2007 3:24

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

function a(i :longint): integer;
begin
a := 1 div i;
end;

procedure b(var i : longint);
begin
i := a(i);
end;

var i : longint;
begin { TODO -oUser -cConsole Main : Insert code here }
i := 0;
b(i);
writeln(i);
end.


1. Хочется получить на экран диагностику с указанием строки, в которой произошла ошибка. Например так, как это делает ТМТ:
Код
RunError #200 (division by zero)
Calls stack:
ERRORTMT.A [ERRORTMT.PAS(10) at 00000009]
ERRORTMT.B [ERRORTMT.PAS(15) at 0000000A]
ERRORTMT.ERRORTMT [ERRORTMT.PAS(21) at 0000000A]

Return code: 4
Execution time: 0.06 seconds
Press any key...


2.Хочется самому получить доступ к отладочной информации. Например, получить в подпрограмме название вызывающей программы.

Автор: Better Kind 18.12.2007 12:44

Обработка исключений try except
Или вы всеже хотите производить декомпиляцию???

Автор: andriano 18.12.2007 15:55

Еще раз: хочу
1. При завершении по ошибке получить посмертный дамп.
2. В вызываемой подпрограмме получать строку с именем вызывающей.

Автор: Malice 18.12.2007 17:31

Цитата(andriano @ 18.12.2007 11:55) *

Еще раз: хочу
1. При завершении по ошибке получить посмертный дамп.
2. В вызываемой подпрограмме получать строку с именем вызывающей.

Копай в сторону api SetUnhandledExceptionFilter для установки своего обработчика исключений, в нем MiniDumpWriteDump для дампа процесса. По дампу обнаружишь в какой функции крякнуло, по стеку - откуда пришло.. Дизассемблер можно прикрутить любой, благо их полно. Чтобы получить название функций придется самому подготовить такую табличку при старте программы - адрес/название, и потом ее использовать при анализе дампа.

Добавлено через 2 мин.
ps только это не отладочная информация, а как бы анализ собственными силами.

Автор: andriano 18.12.2007 18:42

Дело в том, что подавляющее число компиляторов сами составляют такие таблицы и на их основе осуществляют вывод посмертного дампа. Над изготовлением такой таблицы ручками я, разумеется, думал, но эта идея мне не понравлась.
В ТМТ, собственно, я при необходимости получить название вызывающей подпрограммы добываю ее из этой формируемой компилятором таблицы. Хотелось бы иметь возможность делать то же самое из Дельфи.
Подключать дизассемблер - и мысли такой не было. Не нужно это.
Ладно, "копать" в сторону SetUnhandledExceptionFilter я попробую, но, честно говоря, не верится, что такая функция как посмертный дамп может отсутствовать в мало-мальски серьезном крмпиляторе. Неужели в Дельфях это так?
Другое дело, что в любом компиляторе эта функция подключается только при компиляции в отладочном режиме и отключена в основном. Может и Дельфи здесь все-таки следуют стандарту de facto, и эту функцию можно как-то включить?