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

Вниз

Кто-то тут спрашивал про то, как может процесс "исчезнуть"   Найти похожие ветки 

 
Verg ©   (2004-03-31 13:21) [0]

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

Type
 TBuffer = array[0..4095] of integer;
 PBuffer = ^TBuffer;

procedure SomeProc;
var B : PBuffer;
begin
 ........
 Fillchar(B, sizeof(TBuffer), 0);
 ........
end;


 
Digitman ©   (2004-03-31 13:25) [1]

галка забыта ?

т.е. - хрясь! - и обнулили изрядный шматок стека ..

ну эт да, это - верная тихая и мгновенная смерть процесса


 
Verg ©   (2004-03-31 13:27) [2]

При прогоне под отладчиком Дельфя вываливалась с AV, без отладчика - процесс тихо мирно исчезал из системы безо всяких сообщений.


 
Digitman ©   (2004-03-31 13:31) [3]


> Verg


эт называется - самого себя серпом по ... причинному месту))


 
Verg ©   (2004-03-31 13:35) [4]


> Digitman ©   (31.03.04 13:25) [1]


Я просто показал смысл той ошибки, которая было обнаружена. На самом деле, в реальном проекте она появлялась крайне редко (типа раз в неделю). По стечениям обстоятельств нужно было "очень не всегда" заполнять некий буфер неким числом, при том не всегда весь, при этом этот размер как правило оказывался в диапазоне от 1 до 4. Короче, система как бы вполне устойчиво работающая, иногда вдруг исчезала. Парень заподозрил недоброе даже про местный персонал (типа таск манагером прибивают и не сознаются) :)))

Но когда она исчезла однажды прямо у него на глазах, то решено было создать "консилиум" или "мозговой штурм". Вот. Вчера весь день и сегодня 3 программера, включая меня "с пристрастием" исследовали код. :) Когда "глюк" нашелся, парень.... в общем он за пивом убежал :)))


 
Fay ©   (2004-03-31 13:40) [5]

Что-то раз в неделю многовато 8)


 
Digitman ©   (2004-03-31 13:43) [6]


> в общем он за пивом убежал


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


 
Anatoly Podgoretsky ©   (2004-03-31 13:43) [7]

Для таких размеров надо делать тал

procedure SomeProc;
var B : TBuffer;


 
Verg ©   (2004-03-31 13:55) [8]


> ну есссно !! не заздря ж вы пыхтели над его "творчеством")


Так он-то тоже "пыхтел" - опытный, кстати, программер, но от опечаток, видимо никто не застрахован.


> Anatoly Podgoretsky ©   (31.03.04 13:43) [7]


То был динамический буфер, размер которого мог достигать больших значений. Но чаще всего не превышал 4-х.


 
Игорь Шевченко ©   (2004-03-31 14:04) [9]

Для отлова таких ошибок обычно хорошо помогают unit-тесты.


 
Digitman ©   (2004-03-31 14:05) [10]


> Verg ©   (31.03.04 13:55) [8]


ну что тут сказать ... не спорю - и на старуху бывает проруха ..
конечно, от очепяток никто не застрахован ..

касаемо же той самой злосчастной "галки" - я вот, к примеру, сразу взял себе за правило : видя где-то в прототипе той или иной ф-ции ид-р форм.параметра, похожий на "Buffer", сразу же, не доверяя памяти, лезу в модуль с соотв. Паскаль-прототип и явно уточняю, с каким спецификатором передачи фигурирует этот "Buffer" и типизирован ли он ... во всяком случае мне это хорошо помогает - давненько уже на эти грабли не наступал .. про иные грабли, конечно, речи не идет ..


 
Verg ©   (2004-03-31 14:16) [11]

Я примерно знаю что там расслабляет - в дельфи же теперь не обязательно ставить ^ после указателья для доступа к полям записи - вумня, понимаешь.

Вчера весь день искали причину. Сегодня выясняли почему этот глюк стрелял не всегда, а очень редко. Удалось смоделировать ситуевину.
Гадко то, что под отладчиком вылазит сообщение AV, а в "свободном полете" - процесс просто втихоря ложится без объявления войны, что называется.

А тут "под руку" всплыл вопрос в "Сетях", я нашел его

http://delphimaster.net/view/6-1080634018/


 
Verg ©   (2004-03-31 14:22) [12]


> Игорь Шевченко ©   (31.03.04 14:04) [9]
> Для отлова таких ошибок обычно хорошо помогают unit-тесты.


Что ты называешь unit-тестом ?


 
Игорь Шевченко ©   (2004-03-31 14:48) [13]

Verg ©   (31.03.04 14:22)

Unit-тестом я называю элементарную тестирующую процедуру, позволяющую выявить корректность или некорректность фукнционирования программного модуля как при корретных входных условиях, так и при некорректных.

www.xprogramming.ru


 
KSergey ©   (2004-03-31 14:58) [14]

Вот вы тут все умные, конечно...
А можн одля меня тупого: я так и не понял прикола, вернее что именно пропущено: просто память надо было выделить, т.е. именно с указателем хотелось работать, или подразумевалось [7] Anatoly Podgoretsky ©   (31.03.04 13:43)?


 
Digitman ©   (2004-03-31 15:07) [15]


> KSergey


ты мысли ширше)

Андрей ведь не зря многоточие перед FillChar() поставил ... и уточнил, что облажавшийся коллега - не из "чайников" ... следовательно, память он не мог не выделить ... это уже очепяткой не пахнет ...


 
Anatoly Podgoretsky ©   (2004-03-31 15:09) [16]

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


 
KSergey ©   (2004-03-31 15:11) [17]

> [15] Digitman ©   (31.03.04 15:07)
> ты мысли ширше)

Что-то слабо получается...
Ну да надеюсь просеку когда-нибудь... ;)


 
MBo ©   (2004-03-31 15:13) [18]

>KSergey
FillChar(var Buf,...
при передаче указателя пишется по адресу самой переменной-указателя, а не туда, куда он указывает.
Да ты наверняка аналоги уже видел, например, в форуме часто бывает -  
SomeStream.Read(StringVar,size) вместо StringVar[0]


 
KSergey ©   (2004-03-31 15:14) [19]

>  [16] Anatoly Podgoretsky ©   (31.03.04 15:09)

Ах ты, блин! (не Анатолий, конечно)
Это же дельфи! Я никак не погу к его var привыкнуть... Указатели только в си-шном виде воспринимаю, т.е. раз параметр указатель- то указатель... Спасибо.


 
KSergey ©   (2004-03-31 15:15) [20]

>  [18] MBo ©   (31.03.04 15:13)

Ага, допер...
Еще (уже? ;) не совсем.. Что-то соображаю изредка (когда уже конкретно ткнут ;)


 
Поезд уже скоро   (2004-03-31 15:15) [21]

2 KSergey
Они тебя сейчас своими полунамеками изведут ;-)

Fillchar(B^, sizeof(TBuffer), 0);


 
Digitman ©   (2004-03-31 15:16) [22]


> KSergey ©   (31.03.04 15:11) [17]


а ты попробуй самостоятельно "догнать" ..

суто проста - коллега Андрея "забыл" вместо

Fillchar(B^, sizeof(TBuffer), 0);

написал

Fillchar(B, sizeof(TBuffer), 0);

попробуй самостоятельно понять, что при этом (при том что переменная B - локальная в процедуре) страшного произойдет .. подразумевается, что перед этой строчкой в обязательном порядке было что-то а-ля GetMem(B, SizeOf(достаточно)) ..


 
Digitman ©   (2004-03-31 15:22) [23]

вот так вот маленькая неприметная "галка" ставит раком любую сколь-угодно "навороченную" программу ...


 
KSergey ©   (2004-03-31 15:25) [24]

Ага, а еще спутники не долетают...


 
hair_fly   (2004-03-31 15:37) [25]


> Verg ©   (31.03.04 13:21)  

Огромное спасибо за инфу... Теперь хоть ясно ЧТО нужно искать (правда боюсь, что за 3 дня мне не управиться)...


 
han_malign ©   (2004-03-31 15:46) [26]

>т.е. - хрясь! - и обнулили изрядный шматок стека ..

>KSergey ©   (31.03.04 15:11) [17]
>Ну да надеюсь просеку когда-нибудь... ;)

- стек "растет вниз"(ESP уменьшается), fillchar заполняет "вверх"(EDI увеличивается)
- локальная переменная выделяется на стеке, то есть адрес переменной, совпадает со стеком, и лежит ниже адреса возврата (линейная схема адресации - CS=DS=ES=SS, только права доступа разные)
- "выше" локальной переменной в стеке лежат точки возврата предыдущих вызовов

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


 
Verg ©   (2004-03-31 15:49) [27]


> hair_fly   (31.03.04 15:37) [25]
>
> > Verg ©   (31.03.04 13:21)  
>
> Огромное спасибо за инфу... Теперь хоть ясно ЧТО нужно искать
> (правда боюсь, что за 3 дня мне не управиться)...


Так ты пойми, что подобных "штучек" может существовать множество. Я же просто одну из них назвал, и только потому, что тут так все совпало - и твой вопрос, и ситуация из жизни.
Какими еще способами можно "положить" процесс без шуму и пыли - это наверно разговор всетаки для форума "WINAPI".


 
hair_fly   (2004-03-31 16:04) [28]


> Какими еще способами можно "положить" процесс без шуму и
> пыли - это наверно разговор всетаки для форума "WINAPI".

да это-то понятно теперь :)
просто проблема именно в сетевых модулях моей проги, поэтому и подозрение пало именно на работу по сети


 
Игорь Шевченко ©   (2004-03-31 16:16) [29]


> Какими еще способами можно "положить" процесс без шуму и
> пыли - это наверно разговор всетаки для форума "WINAPI".


Halt :)))


 
Verg ©   (2004-03-31 16:25) [30]


> Игорь Шевченко ©   (31.03.04 16:16) [29]


ExitProcess :)))))

И еще много веселых и увлекательных приемов.
Как-то была такая же штучка с кодеками Mpeg Layer 3. Я уже сам тут задавал вопрос давным давно в "Media".....
Так что ж оказалось. Эти там программеры, делавшие этот кодек при тех параметрах вызова, которые их, видете ли не устаривали по тем или иным причинам, вместо того, чтобы дать понять что их собственно не устраивает, делали ExitProcess - жуткое было зрелище, надо вам сказать... жуткое....


 
han_malign ©   (2004-03-31 16:35) [31]

>Halt :)))
- посмотрел тут реализацию _Halt0 - это не "положить" процесс без шуму - это корректно завершить. Чтоб "положить" - нужно ExitProcess...


 
SPeller ©   (2004-03-31 17:05) [32]

TerminateProcess


 
Digitman ©   (2004-03-31 17:33) [33]


> SPeller


имеется ввиду, что процесс "кладет" сам себя ... а не кто-то его извне ...

т.е., самого себя серпом по известным в народе причинным точкам)


 
Verg ©   (2004-03-31 18:11) [34]


> Digitman ©   (31.03.04 17:33) [33]


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

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


 
noname   (2004-03-31 18:18) [35]

> То был динамический буфер, размер которого мог достигать
> больших значений


Ну тогда уж не
type
 TBuffer = array[0..4095] of integer;
...
 FillСhar(B^, SizeOf(TBuffer), 0);

а (как минимум)
type
 TBuffer = array[0..0] of integer;
...
var
 iSize: integer
...
 FillСhar(B^, iSize, 0);


А то иначе какая уж тут динамика? Уж лучше [7] - меньше головной боли и результат тот же...

P.S. Хотя, если приведенный 31.03.04 в 13:21 код -  только для примера, то...


 
Verg ©   (2004-03-31 19:01) [36]

Нет, не вышло - каждый сослался на свои обстоятельства...... В общем ночной клуб отменяется... в следующий раз, а что ? Сережа прень молодой, так сказать, жена его только и ждет.... а вообще не честно так. Людка могла бы и с нами пойти. Че-то заортачилась... Может оно и понятно - недавно девочку родили - как недавно, уж четыре года как. Но все же, не пойму я этого Сирожу... подкаблучник, по-моему... А впрочем, грамотный Мужик....

Сижу дома, сейчас моя придет.... будем веслиться сами... А мы то уж умеем!


 
SPeller ©   (2004-03-31 19:22) [37]


> имеется ввиду, что процесс "кладет" сам себя ... а не кто-то
> его извне ...

А разве процесс сам себе не иожет вызвать TerminateProcess? По-моему может, потому что всякие там показываетели процессов прекрасно убивают сами себя. А если верить Win SDK, то происходит жёсткий "бросок через бедро", в отличие от "пожалуйста присаживайтесь" в случает ExitProcess.


 
Verg ©   (2004-03-31 19:53) [38]


> SPeller ©   (31.03.04 19:22) [37]


Уууууу, что-ты(вы) далеко зашли...
Вы можете привести примеры - как без Terminate[Exit]Process процесс может влегкую сам себя "положить"? Так, скажем, без "прекрас", по ошибочному кодированию, а не по-умыслу?


 
Германн ©   (2004-03-31 23:25) [39]

Еще вариант:
SomeFunction;
begin
 try
   ...
   ...
 except
 end;
end.
При возникновении в ... серьезной ошибки, процесс вылетит "молча". Почти так как раз и было у меня.


 
SPeller ©   (2004-04-01 05:07) [40]


> Verg ©   (31.03.04 19:53) [38]
> Уууууу, что-ты(вы) далеко зашли...

Дык, я TerminateProcess как альтернативу ExitProcess предлагал. Чтобы "уложить". А вот на ваш вопрос как положить процесс ошибками кодирования я ответа не знаю, потому что пока с такими фокусами не сталкивался.



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

Форум: "Потрепаться";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.037 c
3-1080386347
TGrey
2004-03-27 14:19
2004.04.25
Как убрать диалог ввода пароля при подключении к Access?


14-1081168789
Nikolay M.
2004-04-05 16:39
2004.04.25
Программисты - натуры творческие ;-))


3-1080567190
venus
2004-03-29 17:33
2004.04.25
Чтение данных из файла в IB-базу :)


14-1080757008
gn
2004-03-31 22:16
2004.04.25
хочу похвастатся моя любимая написала первую программу


14-1080803078
Фикус
2004-04-01 11:04
2004.04.25
Новый вирус!





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский