Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отлов динамической ошибки по адресу 0х... [WinXP]


Страницы:   1 2

__DATA__ ©   (2007-08-24 17:56:00) 

У пользователя время от времени программа вылетает с ошибкой

Заголовок: Find text: xServer.exe - Application Error

Текст ошибки: The exception unknown software exception (0x0eedfade) accurred in then application at location 0x7c812a5b

Кнопки: Ok и Cancel


Как мне найти строчку кода в .pas файле где происходит данная ошибка ума приложить не могу :(

Буду рад любым советам и наставлениям

Заранее благодарен!


__DATA__   (2007-09-08 12:54:00) [1]

Удалено модератором


__DATA__   (2007-09-07 13:09:00) [2]

Удалено модератором


__DATA__   (2007-09-06 16:15:00) [3]


> Anatoly Podgoretsky ©   (06.09.07 16:01) [30]


Вот что я получаю от этой формы в TserverSocketClientRead Socket.ReciveText


POST /Refresh/login_card HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-icq, application/vnd.ms-excel, application/msword, */*
Referer: http://127.0.0.1:6879/Block.htm
Accept-Language: ru
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)
Host: 198.162.0.90:6280
Content-Length: 42
Connection: Keep-Alive
Cache-Control: no-cache

log=test&pass=&submit=Sign+in&usluga=Games



Так вот от IdHTTPServer хотелось бы получить тоже самое, чтобы выдрать и обработать строку log=test&pass=&submit=Sign+in&usluga=Games

Либо можно получить только эту строку. В ARequestInfo.Params.Text я смотрел, так же как в многих других свойствах, везде пустота.

Где в IdHTTPServerCommandGet можно получить запрос целиком или получить параметры отдельно?


Anatoly Podgoretsky   (2007-09-06 16:01:00) [4]


> http://192.168.1.290:6280/Refresh/login_card'

Вот он, целиком и есть.


__DATA__   (2007-09-06 15:42:00) [5]


> Чем IDHTTPServer не нравится? (мне ненравится и чем я знаю)


А как в этом компоненте получать содержимое полей HTML формы?

Вот форма:


document.write("<FORM METHOD=POST action=' http://192.168.1.290:6280/Refresh/login_card'>");
document.write("<font color=White> Login :</font><br>");
document.write("<input type='text' name='log' size='30'><br>");

document.write("<font color=White> Password :</font><br>");
document.write("<input type='password' name='pass' size='30'><br>");

document.write("<input type='submit' name='submit' value='Enter'><br>");
document.write("<font color=white>Service:</font><br>");
document.write("<select name='usluga'>");
document.write("<option value='Games'>Games</option>");
document.write("</select><br>");
document.write("</form>");


Все свойства компонента пересмотрел нету содержимого полей!

Или может как-то можно получить запрос целиком(как у Socket.ReceiveText в TServerSocketClientRead)? чтобы выдрать содержание полей HTML формы самому?


Slym   (2007-09-05 10:31:00) [6]

  if Socket <> nil then
  begin
    Socket.Close;
    Socket.Free;
    Socket := nil;
  end;

еще раз: у тебя неблокирующий режим! за один ServerSocketClientRead ничего не успеет произойти а ты его песпардонно гасишь


Slym   (2007-09-05 10:28:00) [7]

i := pos(AnsiUpperCase('#AlertText#'),AnsiUpperCase(s));
      while i>0 do
      begin
        Delete(s,i,Length('#AlertText#'));
        Insert(IP,s,i);
        i := pos(AnsiUpperCase('#AlertText#'),AnsiUpperCase(s));
      end;

можно заменить на:
StringReplace(s,'#AlertText#',IP,[rfReplaceAll, rfIgnoreCase]);


Slym   (2007-09-05 10:21:00) [8]

str := Socket.ReceiveText;
Params.Text := DATAMOD.DATA.GetHTTPParams(str);
Не факт что весь запрос придет одним ReceiveText...

Чем IDHTTPServer не нравится? (мне ненравится и чем я знаю)


Slym   (2007-09-05 10:17:00) [9]

WEB сервер пишешь... маладец
Налицо неправильная работа с сокетом...
Use TWinSocketStream to read or write information over a blockingsocket connection
ServerSocketClientRead - указывает обратное неблокирующий режим
SendStream - не успевает полностью отослать данные, т.к. неблокирующий режим


Сергей М.   (2007-09-05 08:17:00) [10]


> Почему?


Потому что нет исходников для указанного кода.


__DATA__   (2007-09-05 06:56:00) [11]


> Можно воспользоваться пунктом Search-Find Error в делфи,
>  чтобы найти место ошибки по адресу.


В контексном меню окна CPU нажимаю View source и нечего не происходит :( Почему?


Германн   (2007-09-04 17:43:00) [12]


> __DATA__   (04.09.07 17:38) [21]
>
> А как узнать номер строки кода (в .pas)исходя из шестнадцатиричного
> адреса(в ошибке), если этот адрес расположен в сегментах
> моего приложения?
>

В [4] уже сказали как.


__DATA__   (2007-09-04 17:38:00) [13]

А как узнать номер строки кода (в .pas)исходя из шестнадцатиричного адреса(в ошибке), если этот адрес расположен в сегментах моего приложения?


GrayFace   (2007-09-04 16:44:00) [14]

Kolan ©   (01.09.07 18:40) [17]
> А как вы это узнали?
> :)

try
 raise Exception.Create('') at $7c812a5b;
except
 ShowException(ExceptObj, ExceptAddr);
end;
:)
(по-моему, не ShowException называется, лежит в SysUtils)
А еще на диске к Рихтеру была полезная прога для определения, какие dll-ки какими процессами загружены по каким адресам, да и другие подобные проги есть.


evvcom   (2007-09-03 10:52:00) [15]


>  finally
>    if strl <> nil then
>    begin
>      strl.Free;
>      strl := nil;
>    end;

1. Что такое strl? Вроде не локальная переменная. Нигде в этой функции не видно ее создания. Если здесь она не создается, почему здесь она убивается?
2. Free сама проверит на nil, потому лишняя проверка.
3. Куча Free в одном finally - не гарантия того, что все, что нужно, будет убито.
Грубое нарушение вот таких несложных правил неизбежно ведет и к мемликам, и другим трудно уловимым ошибкам.
P.S. Дальше первой процедуры нИАсилил :)


Leonid Troyanovsky   (2007-09-01 20:49:00) [16]


> Kolan ©   (01.09.07 18:40) [17]

> > 0x7c812a5b — это kernel32.dll в ХР

> А как вы это узнали?

kernel32 обычно мапится на $7C800000.
Т.е., можно даже предположить, что это произошло
в недрах функции RaiseException.

--
Regards, LVT.


Kolan   (2007-09-01 18:40:00) [17]

> 0x7c812a5b — это kernel32.dll в ХР

А как вы это узнали?
:)


Сергей М.   (2007-08-31 15:39:00) [18]

Справку к TCustomWinSocket.SendStream читал ? Внимательночитал ?


__DATA__   (2007-08-31 15:06:00) [19]


function TDATA.SendStream(var Socket: TCustomWinSocket; Stream: TStream): Boolean;
begin
   Socket.SendStream(Stream);
end;


__DATA__   (2007-08-31 15:04:00) [20]

Вот тут утечка памяти, почему происходит понять не могу :


procedure TMain.ServerSocketClientRead(Sender: TObject;
 Socket: TCustomWinSocket);

var
 SockStream : TWinSocketStream;

begin
 try
   if not Socket.Connected then
       Exit;
     str := Socket.ReceiveText;//Copy(Socket.ReceiveText,Pos('/',Socket.ReceiveText),Pos(' HTTP/',Socket.ReceiveText)-Pos('/',Socket.ReceiveText));
     if str = '' then
       Exit;
     IP := Socket.RemoteAddress;
     Params.Text := DATAMOD.DATA.GetHTTPParams(str);
     if pos('GET ', str) > 0 then
     begin
       str := Trim(Copy(str, pos('GET ', str)+5,Length(str)));
       Delete(str, pos(' HTTP/', str), Length(str));
     end
...
DATAMOD.DATA.SendStream(Socket,Main.GetFileSource(str,IP));

...
 finally
   if strl <> nil then
   begin
     strl.Free;
     strl := nil;
   end;
   if Params <> nil then
   begin
     Params.Free;
     Params := nil;
   end;
   if SockStream <> nil then
   begin
     SockStream.Free;
     SockStream := nil;
   end;
   if Socket <> nil then
   begin
     Socket.Close;
     Socket.Free;
     Socket := nil;
   end;
 end;

function TMain.GetFileSource(FileName,IP: String): TStream;
var
 strl,strl2: TStringList;
 i: Integer;
 s: String;
begin
 try
   strl := TStringList.Create;
   strl2 := TStringList.Create;
   if not FileExists(FileName) then
   begin
     Delete(FileName,Length(FileName)-(Length(ExtractFileExt(FileName))-1),Length(FileName));
     FileName := FileName+'.htm';
   end;
   if not FileExists(FileName) then
   begin
     Delete(FileName,Length(FileName)-(Length(ExtractFileExt(FileName))-1),Length(FileName));
     FileName := FileName+'.html';
   end;

   if not FileExists(FileName) then
   begin
     if FileExists(ExtractFilePath(ParamStr(0))+'DATA\HTTPServerPages\Begin.htm') then
     begin
       strl2.LoadFromFile(ExtractFilePath(ParamStr(0))+'DATA\HTTPServerPages\Begin.htm');
       strl.Text := strl2.Text;
     end;
     if FileExists(ExtractFilePath(ParamStr(0))+'DATA\HTTPServerPages\FaildRequest.htm') then
     begin
       strl2.LoadFromFile(ExtractFilePath(ParamStr(0))+'DATA\HTTPServerPages\FaildRequest.htm');
       strl.Add(strl2.Text);
     end;
     if FileExists(ExtractFilePath(ParamStr(0))+'DATA\HTTPServerPages\End.htm') then
     begin
       strl2.LoadFromFile(ExtractFilePath(ParamStr(0))+'DATA\HTTPServerPages\End.htm');
       strl.Add(strl2.Text);
     end;
     Result := TStringStream.Create(strl.Text);
   end
   else
   begin
     if (DATA.CmpStr(ExtractFileName(FileName),'Alert.htm'))or(DATA.CmpStr(ExtractFileNa me(FileName),'Alert.html')) then
     begin
       strl.LoadFromFile(FileName);
       s := strl.Text;
       i := pos(AnsiUpperCase('#AlertText#'),AnsiUpperCase(s));
       while i>0 do
       begin
         Delete(s,i,Length('#AlertText#'));
         Insert(IP,s,i);
         i := pos(AnsiUpperCase('#AlertText#'),AnsiUpperCase(s));
       end;
       Result := TStringStream.Create(s);
       Exit;
     end
     else
     if (CmpStr(ExtractFileExt(FileName),'.HTML'))or(CmpStr(ExtractFileExt(FileName),'.H TM'))or(CmpStr(ExtractFileExt(FileName),'.JS'))  then
     begin
       strl.LoadFromFile(FileName);
       strl.Text := HTTPServerReplasePath(strl.Text,IP);
       strl.Text := ReplaceJSCmd(strl.Text,IP);
       Result := TStringStream.Create(strl.Text);
       //strl.SaveToStream(Result);
     end
     else
     begin
       i := pos('/',FileName);
       while i>0 do
       begin
         Delete(FileName,i,1);
         Insert('\',FileName,i);
         i := pos('/',FileName);
       end;
       Result := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
     end;
   end;
 finally
   strl.Free;
   strl2.Free;
 end;
end;



> georgius ©   (29.08.07 08:20) [13]


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

ActiveX-ы не используется


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо