Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.10.07;
Скачать: [xml.tar.bz2];

Вниз

Отлов динамической ошибки по адресу 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.069 c
15-1189531493
vasIZmax
2007-09-11 21:24
2007.10.07
"Тарифный" ход


15-1189361532
редкий гость
2007-09-09 22:12
2007.10.07
Java script


2-1189162219
Gringoire
2007-09-07 14:50
2007.10.07
Как обозвать кнопочки?


6-1170874513
sairus
2007-02-07 21:55
2007.10.07
Upload и IdHTTPServer


2-1189577653
Washington
2007-09-12 10:14
2007.10.07
Местоположение формы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский