![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отлов динамической ошибки по адресу 0х... [WinXP]
__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-ы не используется