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

Вниз

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

 
__DATA__   (2007-08-24 17:56) [0]

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

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

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

Кнопки: Ok и Cancel


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

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

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


 
__DATA__   (2007-08-24 17:58) [1]

Забыл добавить. Если нажать кнопку Cancel приложение немедлено закроется, если жать Ок то ошибка будет появляться снова и снова, потом ее текст изменится на другой, потом снова на другой и т.д в конце концов приложение  закроется


 
Rouse_ ©   (2007-08-24 21:27) [2]

0eedfade - говорит о том что памяти нема... Что говорит либо о хорошем мемлике, либо о том что ее действительно нема...


 
TStas ©   (2007-08-25 04:42) [3]

А ещё так бывает, когда объект уже уничтожин, при жизни у него был адрес 0x7c812a5b и с ним что-то сделать хотят.


 
vpbar ©   (2007-08-25 16:46) [4]

Попробуйте обработчик ошибок из madCollection http://madshi.net/ . Очень удобно.  Правда там только для некомерческого применения.
Можно еще собрать обработчик с помощью JclDebug www.delphi-jedi.org .
Можно воспользоваться пунктом Search-Find Error в делфи, чтобы найти место ошибки по адресу.


 
__DATA__   (2007-08-27 07:46) [5]


> vpbar ©   (25.08.07 16:46) [4]


Я уже использую неплохой компонент отлова и показа места ошибок в исходном коде Castalia, однако данную ошибку компонент не перехватывает.
Через Search-Find error если ввести адрес 0eedfade перекинет на пустое место.


> Rouse_ ©   (24.08.07 21:27) [2]


Так ведь должна выскакивать ошибка Out of memory?


> TStas ©   (25.08.07 04:42) [3]


Думаю что данная ситуация в моем коде практически исключена ...


 
Сергей М. ©   (2007-08-27 09:02) [6]


> __DATA__   (24.08.07 17:56)


Что показывает пошаговая трассировка ?


 
Anatoly Podgoretsky ©   (2007-08-27 09:18) [7]

адрес 0x7c812a5b говорит, что он не в его ехе, а в системе, в библиотеках, поэтому отладка и поиск намного сложнее, надо проверять все адреса, которые передаются в АПИ функции.


 
Rouse_ ©   (2007-08-27 11:56) [8]


> Так ведь должна выскакивать ошибка Out of memory?

Где? В системе?


 
__DATA__   (2007-08-27 17:02) [9]


> Rouse_ ©   (27.08.07 11:56) [8]


Увеличил размер файла подкачки, всеравно ошибка выскакивает примерно с той же частотой раз в 1-2 часа, видимо это не связано с утечкой памяти, хоть и небольшая утечка памяти в программе есть ...


> Anatoly Podgoretsky ©   (27.08.07 09:18) [7]


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


 
Anatoly Podgoretsky ©   (2007-08-27 18:34) [10]

Отладчик, голова, настойчивость.
А лучше не допускать таких ситуаций изначально - тогда достаточно пункта 2


 
GrayFace ©   (2007-08-28 18:25) [11]

Rouse_ ©   (24.08.07 21:27) [2]
0eedfade - говорит о том что памяти нема... Что говорит либо о хорошем мемлике, либо о том что ее действительно нема...

Как Вы это узнали?

TStas ©   (25.08.07 4:42) [3]
А ещё так бывает, когда объект уже уничтожин, при жизни у него был адрес 0x7c812a5b и с ним что-то сделать хотят.

Не бывает, т.к. 0x7c812a5b - это kernel32.dll

__DATA__   (27.08.07 17:02) [9]
Увеличил размер файла подкачки, всеравно ошибка выскакивает примерно с той же частотой раз в 1-2 часа, видимо это не связано с утечкой памяти, хоть и небольшая утечка памяти в программе есть ...

Независимо от файла подкачки, у программы в Win32 есть менее 2Гб (при особых настройках - менее 3Гб) виртуальной памяти, может кончается она... В любом случае, как-то жирно.


 
GrayFace ©   (2007-08-28 18:26) [12]

* 0x7c812a5b - это kernel32.dll в ХР


 
georgius ©   (2007-08-29 08:20) [13]

Чтобы проверить гипотезу об исчерапнии памяти достаточно предложить юзеру нажать Ctrl+Alt+Del и посмотреть в Task Manager-е колонку "память".
Но что-то мне подсказывает, что дело не в этом. ActiveX-ы какие-нибудь используются?


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

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


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-ы не используется


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


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


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

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


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

> 0x7c812a5b &#151; это kernel32.dll в ХР

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


 
Leonid Troyanovsky ©   (2007-09-01 20:49) [18]


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

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

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

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

--
Regards, LVT.


 
evvcom ©   (2007-09-03 10:52) [19]


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

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


 
GrayFace ©   (2007-09-04 16:44) [20]

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

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


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

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


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


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

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


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


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


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


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


> Почему?


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


 
Slym ©   (2007-09-05 10:17) [25]

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


 
Slym ©   (2007-09-05 10:21) [26]

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

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


 
Slym ©   (2007-09-05 10:28) [27]

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:31) [28]

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

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


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


> Чем 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 формы самому?


 
Anatoly Podgoretsky ©   (2007-09-06 16:01) [30]


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

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


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


> 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 можно получить запрос целиком или получить параметры отдельно?


 
__DATA__   (2007-09-07 13:09) [32]

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


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

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



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

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

Наверх




Память: 0.56 MB
Время: 0.021 c
2-1189438763
Jimmy
2007-09-10 19:39
2007.10.07
Собственная иконка своего компонента


15-1189306522
Aller
2007-09-09 06:55
2007.10.07
виста + хп


2-1189240396
Дядя
2007-09-08 12:33
2007.10.07
График


15-1189276249
Черный Шаман
2007-09-08 22:30
2007.10.07
Портирование приложений под Линукс.


15-1189357149
anton773
2007-09-09 20:59
2007.10.07
почему дата отображается полностью