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

Вниз

Invalid pointer operation при пинге - в чем засада?   Найти похожие ветки 

 
fylhtq ©   (2004-07-06 14:52) [0]

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

[B]Project zzz.exe raised exception class EInvalidPointer with message "Invalid pointer operation"[/B]

причем определенные хосты пингует без проблем, а другие ни в какую.
ps Эта ошибка выскакивает по окончанию выполнения пингующей процедуры.

procedure TForm1.PingClick(Sender: TObject);
Var
    name:PAnsiChar;
    i:Integer;
begin
    If not(CheckHostName) Then Exit; // проверка правильности написания имени хоста

    hIP := IcmpCreateFile();
    GetMem( pIpe, sizeof(icmp_echo_reply) + sizeof(pingBuffer));
    pIpe.Data := @pingBuffer;
    pIpe.DataSize := sizeof(pingBuffer);
    wVersionRequested := MakeWord(1,1);
    error := WSAStartup(wVersionRequested,lwsaData);
    name:= PChar(Form1.HostName.text);
    pHostEn := gethostbyname(name);
    destAddress := PInAddr(pHostEn^.h_addr_list^)^;
    // пингуем
    listbox1.items.Add("пингуем "+pHostEn^.h_name+" ["+inet_ntoa(destAddress)+
                       "] размер пакета "+IntToStr(PingSize)+" байт:");

   for i:=1 to PingCounts {глобальная integer} do
   begin
     Application.ProcessMessages;
     If StopFlag Then
     Begin
          StopFlag:=False;
          Break
     End;
     IcmpSendEcho(hIP,destAddress.S_addr,@pingBuffer,PingSize,Nil,pIpe,
                  sizeof(icmp_echo_reply)+PingSize,5000);
     error := GetLastError();
     if (error <> 0) then listbox1.items.Add(IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
                             IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
                             IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
                             IntToStr(HiByte(HiWord(pIpe^.Address)))+"   "+
                             "Узел недоступен")
     ELSE listbox1.items.Add(IntToStr(LoByte(LoWord(pIpe^.Address)))+"."+
                             IntToStr(HiByte(LoWord(pIpe^.Address)))+"."+
                             IntToStr(LoByte(HiWord(pIpe^.Address)))+"."+
                             IntToStr(HiByte(HiWord(pIpe^.Address)))+"   "+
                             "Время отклика: "+floattostr(pIpe.RTTime)+" мс")
   end;
   IcmpCloseHandle(hIP);
   WSACleanup();
   FreeMem(pIpe);
   end;


 
Digitman ©   (2004-07-06 15:34) [1]

отладчик тебе в руки - и вперед !


 
fylhtq ©   (2004-07-06 15:38) [2]

Большое спасибо, очень продуктивный ответ...


 
Anatoly Podgoretsky ©   (2004-07-06 15:47) [3]

Информации недостаточно, много неизвестных переменных, управляемых извне. Так что только отладчикю


 
fylhtq ©   (2004-07-06 16:25) [4]

Ну хоть копать то в какую сторону?


 
Reindeer Moss Eater ©   (2004-07-06 16:33) [5]

Копай в сторону поиска строки на которой вываливается ошибка


 
Digitman ©   (2004-07-06 16:55) [6]


> fylhtq ©   (06.07.04 15:38) [2]
> Большое спасибо, очень продуктивный ответ...


а ты как думал ?

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


> ошибка выскакивает по окончанию выполнения пингующей процедуры


и что есть, по-твоему, "окончание выполнения .. процедуры" ?
с т.з. маш.кода это есть выполнение инструкции RET N, а что тобой подразумевается - одному тебе известно, ты же не сподобился конкретизировать, мол, нате вам, сами догадывайтесь, что у меня в голове ..


 
fylhtq ©   (2004-07-06 16:55) [7]

IcmpSendEch(hIP,destAddress.S_addr,@pingBuffer,PingSize,Nil,pIpe,
           sizeof(icmp_echo_reply)+PingSize,5000);

hIP:THandle;
destAddress : In_Addr;
pingBuffer : array [0..31] of Char;
pIpe : ^icmp_echo_reply;
icmp_echo_reply = packed record
PingSize:Integer;

Хрен его знает, в другой аналогичной проге все работает... =:[
Сверил их чуть ли не побуквенно - все идентично, разве что имя переменной PingSize там другое...


 
Digitman ©   (2004-07-06 16:59) [8]


> IcmpSendEch(hIP,destAddress.S_addr,@pingBuffer,PingSize,Nil,pIpe,
>            sizeof(icmp_echo_reply)+PingSize,5000);


эт чего ?
хочешь сказать, что на этой строчке происходит упомянутое исключение ? да не выдумывай небылиц !


 
fylhtq ©   (2004-07-06 17:00) [9]

В том смысле, что ежели ее закомментировать, то ошибка не выскакивает.

2Digitman
По моему, окончание процедуры - выполнение оператора "End;"


 
Digitman ©   (2004-07-06 17:09) [10]


> fylhtq ©   (06.07.04 17:00) [9]
> В том смысле, что ежели ее закомментировать, то ошибка не
> выскакивает.


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


> По моему, окончание процедуры - выполнение оператора "End;"


ну а за ним-то, за этим оператором, что-то происходит, наверно !
ты трассировал код, который выполняется следом за возвратом из процедуры ?


 
fylhtq ©   (2004-07-06 17:16) [11]

Нет конструктива? Тогда какого фига!
Наверно я не от того, что у меня где-то засвербило вопрос задал, наверно я и сам пытался как-то разбираться? Вам так не кажется?
Не претендую на хорошее знание языка и специфики - потому и пытаюсь разобраться, а так как ошибка все-таки довольно специфическая - хотел по крайней мере узнать о направлении поиска глюка, так-как сам уже уперся.
А засирать и отправлять RTFM не надо, это я и сам умею.


 
Digitman ©   (2004-07-06 17:27) [12]

конструктив один - и тебе уже дан - пошаговая трассировка процедуры с проверкой всех задействованных параметров на соответствие ожидаемым


 
fylhtq ©   (2004-07-06 17:34) [13]

Такой конструктив я и сам уже осуществил, все параметры соответствуют ожидаемым.


 
Digitman ©   (2004-07-06 17:39) [14]


> fylhtq ©   (06.07.04 17:34) [13]


однако на сей момент так и непонятно, КАКОЙ КОНКРЕТНО оператор вызывает исключение ! и это ты называешь "конструктивом" - клещами вытягивать из тебя то, что ты давно уже должен был сделать - досконально выяснить это и сообщить сюда, коль ждешь помощи ?


 
fylhtq ©   (2004-07-06 18:59) [15]

Конец процедурыЖ
xor eax,eax
...
mov edx,$0000000f
call @LStrArrayClr
> call @FreeMem
>> call @Error
Это о чем нибудь говорит?


 
fylhtq ©   (2004-07-06 19:03) [16]

Мне просто интересно, как связать исполнение IcmpSendEcho с ошибкой очистки памяти?


 
Digitman ©   (2004-07-07 08:51) [17]


> Это о чем нибудь говорит?


говорит о том, что ты по прежнему не понимаешь вопроса

я не требовал от тебя трассировать маш.инструкции, все что нужно знать для поиска причины - какой оператор Паскаля вызывает исключение при исполнении ! Если это end, так и скажи !


> интересно, как связать исполнение IcmpSendEcho с ошибкой
> очистки памяти


связь простая - переменная PingSize в момент передачи ее значения в ф-цию содержит некорректное значение, что и приводит к печальным результатам

читаем справку из MSDN по параметрам ф-ции:

...
RequestData
[in] Buffer that contains the data to send in the request.

RequestSize
[in] Size of the request data buffer, in bytes. //а у тебя какая-то PingSize, непонятно какое значение имеющая !

ReplyBuffer
[out] Buffer to hold any replies to the request. Upon return, the buffer contains an array of ICMP_ECHO_REPLY structures followed by the options and data for the replies. The buffer should be large enough to hold at least one ICMP_ECHO_REPLY structure plus MAX(RequestSize, 8) bytes of data since an ICMP error message contains 8 bytes of data.

ReplySize
[out] Size of the reply buffer, in bytes. //и опять у тебя здесь фигурирует PingSize с непонятно каким значением !

чему равно у тебя значение PingSize на момент вызова ф-ции - это, разумеется, великий секрет


 
Anatoly Podgoretsky ©   (2004-07-07 09:00) [18]

Партизан


 
fylhtq ©   (2004-07-07 11:33) [19]


> Digitman ©   (07.07.04 08:51) [17]


> какой оператор Паскаля вызывает исключение при исполнении
> ! Если это end, так и скажи !



> ps Эта ошибка выскакивает по окончанию выполнения пингующей
> процедуры


> По моему, окончание процедуры - выполнение оператора "End;"


> IcmpSendEch(hIP,destAddress.S_addr,@pingBuffer,PingSize,Nil,pIpe,
>            sizeof(icmp_echo_reply)+PingSize,5000);


> В том смысле, что ежели ее закомментировать, то ошибка не
> выскакивает.

Прошу прощения. но ЧЕМ вы читали мой вопрос?


 
fylhtq ©   (2004-07-07 11:53) [20]

Да кстати

> Такой конструктив я и сам уже осуществил, все параметры
> соответствуют ожидаемым.

В том числе и PingSize.(=64)

Если тут и есть завязки, то явно не на нее, так как

> определенные хосты пингует без проблем, а другие
> ни в какую.

При всех других прочих одинаковых. Т.Е. различия только в pHostEn^.h_name, destAddress.S_addr, etc...


 
Digitman ©   (2004-07-07 12:12) [21]


> В том числе и PingSize.(=64)


64 - от балды взято ? хочу, мол, 64 и все тут ?
в то время как размер массива pingBuffer у тебя равен 32 ?
или сейчас будешь утверждать, что "в другой аналогичной проге", в которой "все работает", при буфере pingBuffer равном 32 байта переменная PingSize (или как ее там) тоже равна 64 ?


 
fylhtq ©   (2004-07-07 12:27) [22]


> Digitman ©   (07.07.04 12:12) [21]

Благодарю, ошибку понял. Я несколько не верно представлял себе механизм действия - бывает.

Однако с этим можно было разобраться и не разводя такую обширную дисскуссию с тыканьем мордой в грязь.

PS Однако в "другой аналогичной проге" таки все работает при любом значении PingSize, что и ввело в заблуждение... Видимо там все несколько иначе в конечном коде распологалось и не вредило. Темные силы электричества... =:]


 
Digitman ©   (2004-07-07 12:38) [23]


> несколько не верно представлял себе механизм действия -
> бывает


для этого существует оригинальная док-ция от Майкрософт, почитав которую можно получить верное представление


> дисскуссию с тыканьем мордой в грязь


никто тебя не "тыкал", не выдумывай

> Однако в "другой аналогичной проге" таки все работает при
> любом значении PingSize


не выдумывай
если PingSize <= sizeof(PingBuffer), то - да, работает, в противном случае - та же самая ситуация будет наблюдаться

разберись почему, оно полезно


 
fylhtq ©   (2004-07-09 14:05) [24]

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



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

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

Наверх




Память: 0.54 MB
Время: 0.038 c
3-1092435789
JaVa73
2004-08-14 02:23
2004.09.12
Отображение данных в DBComboBox


8-1087910010
Chery
2004-06-22 17:13
2004.09.12
MediaPlayer. Как развернуть файл во весь экран?


1-1093518032
HydraMarat
2004-08-26 15:00
2004.09.12
Вставка строки в PChar


3-1092553734
Penquin-RUS
2004-08-15 11:08
2004.09.12
Как сделать скроллинг сетки(TDBGrid).. ?


3-1092742537
Эдик Дятлов
2004-08-17 15:35
2004.09.12
Как получить подключенных пользователей в базе SQL Anywhere