· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Вот такой виндовс... вот такие глюки.... (информац

Посл.отвђт Сообщенiе


Дата: Июн 12, 2003 03:42:23

Вот значит с каким глюком в 98/ME виндах я столкнулся... (проверял у себя - даже МЕ специально поставил)
Если обращатся к GlobalAlloc c параметром
dwBytes, имеющим очень маленькое значение (200 байт например), то в 95% случаях следующее обращение к API из ws2_32.dll вызывает повисон в kernel32 (заметте! повисон, а не неудачное завершение.)
Со стеком всё ОК, с флагами и регистрами тоже.

Интересно, что народ думает по этому поводу.


Дата: Июн 12, 2003 05:11:08

то в 95%
???
Что-то не получилось у меня воспроизвести этот глюк (WinME без апдейтов):

-- code --
invoke WSAStartup,2,OFFSET wsadata
invoke GlobalAlloc,GMEM_FIXED,200
push eax
invoke socket,PF_INET,SOCK_STREAM,IPPROTO_TCP
invoke closesocket,eax
call GlobalFree
-- code --

Пробовал менять версию winsock, вызываемую ф-цию API, кол-во байт в dwBytes и пр. А ME всё не виснет...


Дата: Июн 12, 2003 06:20:59

to C0RP$E
У меня как то возникала ошибка обращения к памяти при вызове совершенно безобидной функции из кернела. Среди параметров этой функции не было никаких указателей и я долго не мог понять в чем дело. А дело было в том что я малость испортил heap, а эта функция для чего-то выделала там память. Конечно если верить, что в программе ошибок нет, то баг будет найден в винде. Но я думаю что следует тщательно проверить что делается с выделенной памятью.


Дата: Июн 12, 2003 22:21:08 · Поправил: Sk. Inc.

2 C0RP$E
А ты уверен, что ошибка именно в этой функции или ее вызове?
Я как-то сильно Винду XP повесил, а после перезагрузки, почти все работающие до этого проги (написанные мною на асме) стали выдавать сообщение об ошибке записи в адрес памяти, допустимый только для чтения. Глюк оказался в том, что повредилась одна из библиотек из комплекта драйверов для видюх на чипсете NVidia. Эта библиотека позволяет делать прозрачными окна при их перетаскивании (точно говорю, есть там такая настройка, но работает только в WinXP). Все решилось переустановкой драйверов.
Мораль сей басни такова, что всякий хлам, который подгружается без нашего ведома к нашим программам, может вредить их стабильной работоспособности. Так что попробуй проверить этот баг на другом компе с этой же самой виндой (винда должна быть установлена с того же самого диска) и если баг исчезнет, то значит, что именно у тебя в системе есть что-то, мешающее работе программы.


Дата: Июн 13, 2003 00:48:44

Quantum
я делал так -
;;;;;;;;;;;;;;;; eax=200
invoke GlobalAlloc,GMEM_MOVEABLE + GMEM_ZEROINIT,eax
invoke GlobalLock,eax

а затем WSAStartup
;=== GPF on 0xfffчегототам in kernel32.dll

То, что в системе всё ОК подтверждает тот факт, что я специально ПОСЛЕ этого поставил с "чиста" МЕ (4.90.3000) - в нём было точно также.

уж поверьте мне - с памятью порядок. стоит только вместо 200 запихнуть в dwBytes 2000 и баг ИСЧЕЗАЕТ.

а... вот забыл сказать - код находится в отдельной dll


Дата: Июн 13, 2003 02:52:04

Чтобы программа работала стабильно главное не отдавать управление операционнай системе!


Дата: Июн 13, 2003 03:52:34

2 C0RP$E

Попробуй использовать LocalAlloc. Гарантированно, работает под XP даже с 4 байтами. Разницы между ними похоже нету (в MSDN'e я ее не нашел).

Кстати я согласен с кодом Quantum'a - использование GMEM_FIXED позволяет избавиться от необходимости вызывать GlobalLock/Unlock, а чем меньше функций, тем лучше.


Дата: Июн 13, 2003 03:56:15

Предыдущее сообщение Анонима считать моим.


Дата: Июн 13, 2003 06:44:09

C0RP$E
я делал так - ...
Проверил и так (в отдельной DLL) и ничего.
Может у вас этот код находится в DllMain? Тогда проблема связана с WSAStartup, которая выполняет подгрузку библиотеки WinSock, а подобные операции строго воспрещены в DllMain'е. Возможно, GlobalAlloc как-то влияет на процесс подгрузки DLL.


Дата: Июн 13, 2003 07:07:23

Скорее всего что-то у вас.


Дата: Июн 14, 2003 00:13:20

"Попробуй использовать LocalAlloc"
- тут не в том дело, что надо использовать - у меня с этим проблем нет - я просто представил случившийся ФАКТ. Да и случай этот (использование 200 байт) произошёл чисто случайно.
"Может у вас этот код находится в DllMain"
- НЕТ конечно.
"Скорее всего что-то у вас."
- если учесть то, что ради эксперимента я писал код вчистую + запихнул GMEM_FIXED, то можно сойтись на индивидуальной глюкавости компа. Тему считаю закрытой.


Дата: Июн 14, 2003 01:02:16

В догонку. Ребята, не пользуйте вы LocalAlloc/GloballAlloc никогда, и тем более с флагом LMEM_FIXED/GMEM_FIXED. Эти функции оставлены исключительно для совместимости с 16-разрядным кодом. В 32-разрядном режиме разницы между LocalAlloc и GloballAlloc нет никакой. В конечном итоге обе они вызывают HeapAlloc, которую и надо пользовать. Что касается флагов *MEM_FIXED, то они только вредны, так как заставляют систему закрепить страницы за физической памятью, что во-первых требует время, во-вторых связывает системе руки, когда нужно дефрагментировать память. И самое главное толку от них никакого.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.087