Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Отладка программы во время работы с DirectX   Найти похожие ветки 

 
Zergling ©   (2003-10-07 12:29) [0]

День добрый, гаспода и дамы! Вопрос в следующем. Как можно удобно отлаживать программу во время работы с DirectX. Программа работает в полноэкранном режиме. Напимер у меня вылетает программа на некой строчке и среду разработки мне соотвественно не видно (по Alt+Tab не катит). Пока обхожусь ведением простенького лога ошибок. Как мне увидеть/определить где вылетела программка. Поделитесь опытом. Заранее спасибо за помошь.


 
pasha_676 ©   (2003-10-07 12:35) [1]

Писать лог сложнее. Лог подробнее.


 
cyborg ©   (2003-10-07 12:36) [2]

Запускай программу не из Дельфи, а скомпиленную. При ошибке тебе сообщат адрес этой самой ошибки, затем ставьшб точку прерывания в саомо начале работы программы, когда вообще ничего не делается, т.е. до инициализации DirectX. В меню Search-FindError- введи адрес ошибки и попадёшь на ту строчку.


 
cyborg ©   (2003-10-07 12:37) [3]

елки, буквы опечатались :)


 
cyborg ©   (2003-10-07 13:07) [4]

Совет, убери из проекта модуль Classes, пока он тебе вообще не нужен, только ради стринглиста, вот тебе мой модуль для ведения логов:


unit GameLogger;
interface
//Ведение лог-файла
uses
 SysUtils;

procedure LogError( ErrorMessage : string; Location : string );    //Вывод в файл ошибки
procedure LogWarning( WarningMessage : string; Location : string );//Вывод в файл предупреждения
procedure LogStatus( StatusMessage : string; Location : string );  //Вывод в файл статуса программы
Var
 IPFile : Text;

implementation
var
 LogFile : Text; //Указатель на файл
procedure LogError(ErrorMessage, Location: string);
begin
 WriteLn(LogFile,"ОШИБКА: [ " + TimeToStr(Time) + " ] Сообщение: -="+ErrorMessage+"=- "+ Location);
 Flush(LogFile);
end;
procedure LogStatus(StatusMessage, Location: string);
begin
 WriteLn(LogFile,"СТАТУС: [ " + TimeToStr(Time) + " ] Сообщение: -="+StatusMessage+"=- "+ Location);
 Flush(LogFile);
end;
procedure LogWarning(WarningMessage, Location: string);
begin
 WriteLn(LogFile,"ВНИМАНИЕ: [ " + TimeToStr(Time) + " ] Сообщение: -="+WarningMessage+"=- "+ Location);
 Flush(LogFile);
end;
initialization
begin
 AssignFile(LogFile,"LogFile.txt");
 Rewrite(LogFile);
 LogStatus( "Старт программы", "Initialization GameLogger unit" );
end;
finalization
begin
 LogStatus( "Завершение программы", "Finalization GameLogger unit" );
 Flush(LogFile);
 CloseFile(LogFile);
end;
end.


 
cyborg ©   (2003-10-07 13:10) [5]

Var
IPFile : Text;

тут не нужно


 
Zergling ©   (2003-10-07 13:11) [6]

cyborg ©  

Спасибо. Будет время поэксперементирую :)


 
NailMan ©   (2003-10-07 13:14) [7]

Я для отлова багов юзаю оконный режим и не маюсь насчет alt+tab  ж-)

Естественно рядовому юзверю этот режим уже будет недоступен(есть некая сильная защита) и ему доступно тольно FullScreen.

Собсно лог у меня тоже ведется - подробнейший(если включен DEV_MODE) или не очень. В подробный лог заносится какие текстуры грузятся, какие объекты создаются(тип объекта, координаты etc)+ много чего еще второстепенного, которое позволяет отловить какой-то баг. Каждая операция D3D сопровождается записью статуса SUCCESS.

Вот пример моего лога запущенного на машине которая у меня на работе(видяха встроенная i815) лог прервался на какой-то ошибке(видимо из-за этого кривого железа) и теперь можно будет чё-то понять:
http://nailman.narod.ru/Zakroma/utlogging.log

Так что советую делать возможность и оконного режима благо разница при создании окна минимальна, вот даже прототип функции создания окна:

Procedure CreateMainWindow(FullScreen:Boolean);
begin
 with WndClass do begin                                     // Window parameters
   style := CS_VREDRAW or CS_HREDRAW;
   lpfnWndProc := @WndProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   WndClass.hInstance := HInstance;
   hIcon := LoadIcon(HInstance, IDI_APPLICATION);
   hCursor := LoadCursor(HInstance, IDC_ARROW);
   hbrBackground := GetStockObject(BLACK_BRUSH);
   lpszMenuName := nil;
   lpszClassName:= @AppName;
 end;
 RegisterClass(WndClass);
 If FullScreen then
 Handle:=CreateWindowEx(WS_EX_TOPMOST, @AppName, "Universal Traveller: Space Pyrate", WS_POPUP, 0, 0,
                     ScreenWidth,ScreenHeight, 0, 0, HInstance, nil)
 else
 Handle:=CreateWindow(@AppName,"Universal Traveller: Space Pyrate",CW_USEDEFAULT, 0, 0, ScreenWidth, ScreenHeight, 0, 0, HInstance, nil);
end;


Ну и добавить указания WINDOWED в D3DPresentParam`s.


 
Zergling ©   (2003-10-07 13:26) [8]

NailMan ©  (07.10.03 13:14) [7]
Тоже попробуем.



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.029 c
1-1082571459
Lena19
2004-04-21 22:17
2004.04.11
Scrollbox и колесо мыши


8-1070901178
Stexen
2003-12-08 19:32
2004.04.11
DSPack, Что не правильно делаю??


14-1079106741
Тимохов
2004-03-12 18:52
2004.04.11
Про XML и Excel


3-1081424142
WondeRu
2004-04-08 15:35
2004.04.11
ADO, MySQL, CGI, MS IIS нечто несовместимое?


9-1070216613
mrAld
2003-11-30 21:23
2004.04.11
Мультитекстурирование