Помогите побороть ошибку: Программа выполнила недопустимую операцию и будет закрыта.
27.05.2009, 19:17. Показов 2656. Ответов 0
Значит в проге используются потоки. Все работает отлично.
Но при выходе сразу после команды END вылетает следующая ошибка
Программа выполнила недопустимую операцию и будет закрыта.
По кнопке сведения выдает следующее
————
Программа PROJECT1 вызвала сбой при обращении к странице памяти
в модуле MSVBVM60.DLL по адресу 0167:66014555.
Регистры:
EAX=00000000 CS=0167 EIP=66014555 EFLGS=00010206
EBX=ffffffff SS=016f ESP=0064fc30 EBP=0064fc34
ECX=00401182 DS=016f ESI=020bfe9c FS=3c77
EDX=8194ebfc ES=016f EDI=0064fce0 GS=0000
Байты по адресу CS:EIP:
8b 46 0c 8b 00 8b 40 04 89 45 08 eb e7 33 c0 eb
Содержимое стека:
0127f010 0064fc50 66014e73 00000000 66014d99 0064fce0 0127f010 00000000 0064fc70 6601b4ad 00000001 0127f010 00000000 00000000 00000000 0117f114
———-
Перед выходом из программы почистил все объектные переменные.
Может кто чего подскажет. Как побороть эту ошибку.
ПОМОГИТЕ!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|||
| «Программа выполнила
10.11.04 — 11:19 |
Я работаю с клиентами по наладке и установке 1С. И вот у некоторых из них довольно часто происходит по непонятным мне причинам вылет из 1С с вышеуказанным сообщением(«Программа выполнила недопустимую операцию и будет закрыта»). При этом никаких номеров ошибки больше не выдается. Просто 1С закрывается и все. Причем причину я выяснить не могу, т.к. при повторном запуске такой ситуации м. и не быть. А если она происходит всегда, то спасет либо перезагрузка машины, либо просто все начинает нормально работать на следующий день. |
||
| warenic
1 — 10.11.04 — 11:22 |
<><>‹—Гаґџ“З©ґ•цЊВЕг¶И“ђыІИфЉ•ГGгІџ›“©І•§Љ—Гг¶И“ђяІ•чЉ’”OгзџЖђэІ•уЉЕГGґеИ“ђяІ’р‰ћГOгІњА“ьеАN§Э—ГLгіџВ“«ІАҐЉ—”µеМ‘В«д•уЉВАNгдџ–З©±З Љ”Гґ¶џЖђЁ±‘уЉ•ГGгдџ“З©±Б Љ–Аґ¶џ—ђЎІВЉђГGгіџљЗ©ІИOҐЉВАMгањ“ђ©ІВЉЕГOа·њАЗ©ІВOҐЉЖГа·џАђь±БOҐЉ•Ггіџ‘ђ©±ВцЭ—АNґ¶џЕђьІ‘ ЉДГгвџ“ђъІИOр罹††ъЈх™Чр}•е |
||
| Zanuda
2 — 10.11.04 — 11:22 |
Я подозреваю, что одна или несколько сетевух глючат. Соединение с сервером прерывается, и вот результат. По моему, проблеме в сетке. |
||
| edd
3 — 10.11.04 — 11:26 |
(2) В общем ты угадал в 90% — это компы в сети. Но вот был случай, кода глючил именно комп, на котором стояла база, и где была программа 1С сама. Спасло то, что второй ОС стоял XP — под ним проблем не было. |
||
| Zanuda
4 — 10.11.04 — 11:29 |
(3) С такой проблемой не сталкивался. |
||
| edd
5 — 10.11.04 — 11:32 |
А ОС какая утебя? |
||
| Zanuda
6 — 10.11.04 — 11:35 |
(5) Операционка — винда 2000. А при и нициализации — может быть одновременно на другом компе кто-нить тоже пытался в базу войти. 1С поди по таймауту и вылетела… |
||
| edd
7 — 10.11.04 — 11:43 |
Исключено: все было на одной машине. И была она не в сети. К тому же если таймаут, то она не вылетает сразу, а говорит, что истекло время ожидания и что-то там еще. |
||
| noook
8 — 10.11.04 — 11:45 |
память |
||
| Spirtus
9 — 10.11.04 — 11:46 |
Мне в свое время помогла игра с дровами принтера. Игра заключалась в шаманских плясках с бубном и установке дефолтных драйверов из операционки. |
||
| kamazist
10 — 10.11.04 — 11:51 |
У меня была проблема с печатью регламентированных отчетов. Когда отправляешь на печать вылетала 1С-ка. Спасла переустановка предприятия. По видимому в твоем случае все же гонит винда. |
||
| Путин
11 — 10.11.04 — 11:54 |
У меня регулярно подобная ситуация. Подозрение на аппаратную часть (память?) |
||
| edd
12 — 10.11.04 — 11:59 |
Ну хоть приятно, что я не одинок :-). В принчипе — не сомневался ни сколько. Проще — когда одна машина, хуже то, что у всех клиентов разные принтера, разные (скорее всего) дистрибутивы виндовс, разные релизы платформ. Понтяно, что память, принтеры. Хотелось бы реальных подтверждений, фактов. Ну да видимо с этим сложнее. Главно, что характер глюков является хаотическим — то есть то нет. |
||
|
edd 13 — 10.11.04 — 12:01 |
Здраствуйте, Владимир Владимирович. (:-)) да, только вот под той же аппаратной частью по 98 — глючит почти всегда (войти нельзя — при инициализации), а вот по XP там же — все без проблем. Драйвера, ядро…? |
![]() |
|
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену… по-видимому, нам следует остановиться на чем-то одном из двух. |
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Что такое Shdocvw.dll? Shdocvw.dll — Windows Explorer-файл, который, как известно, генерирует ошибки, потому что путь к ключу реестра пустой, DLL является незарегистрированным, или если файл отсутствует.
В этой статье мы обсудим несколько примеров ошибок shdocvw.dll и какие нужно предпринять для их решения .
Ошибка 1
На компьютере с системой Windows XP, когда вы дважды щелкните правой кнопкой мыши на ярлык » Мои Документы» на рабочем столе, вы можете получить сообщение об ошибке, указанные ниже:
“Explorer — Эта программа выполнила недопустимую операцию и будет закрыта”.
Когда вы щелкните Подробности,появится одно из следующих сообщений :
“Программа Explorer вызвала ошибку в стеке памяти в модуле SHDOCVW.DLL в <адресе памяти>”
— Или —
“Программа Explorer вызвала ошибку в стеке памяти в модуле KERNEL32.DLL в <адресе памяти>”
Причина ошибки
Выше написанные сообщения об ошибке возникают, когда значения в реестре пустые или не содержат путь к папке » Мои Документы».
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders
Разрешение ошибки
Примечание: Шаги, описанные ниже, требуют редактирования реестра. Рекомендуется, чтобы вы выполняли эти шаги с осторожностью, и только если вы можете работь с Реестром Windows. Ошибки при изменении реестра могут нанести непоправимый ущерб вашей системе. В качестве меры предосторожности, всегда делайте резервную копию реестра перед внесением изменений в реестр. Вы можете создать резервную копию реестра вручную или использовать для этой цели надежный инструмент реестра, такой, как RegGenie .
Для исправления сообщений об ошибке написанных выше, выполните следующие действия:
- Нажмите кнопку Пуск и нажмите кнопку Выполнить.
- В поле введите : regedit и нажмите Enter, чтобы открыть Редактор Реестра.
- Далее перейдите и выберите следующую запись реестра
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders - Далее, в правой панели окна Редактора Реестра , найдите и дважды щелкните Личные значения.
- В поле Значение Данных введите путь к папке » Мои Документы » (путь по умолчанию : C:Мои Документы), и нажмите кнопку OK.
- Перезагрузите компьютер.
Ошибка 2
На компьютере с Windows XP, при попытке подключиться к веб-сайту, используя Internet Explorer 7 или Internet Explorer 8 с пакетом Обновления 1 — отображается пустая страница , вместо веб-сайта который вы хотели открыть.
Причина ошибки
Выше описанная проблема возникает, когда в системе есть некоторые не зарегистрированные DLL обновления.
Разрешение ошибки
Решение,для выше описанного сообщения об ошибке, сначала нужно зарегистрировать файлы urlmon.dll и actxprxy.dll и перезапустить Internet Explorer. Если проблему устранить не удалось, то зарегистрируйте следующие библиотеки:
- shdocvw.dll
- browseui.dll
- mshtml.dll
- msjava.dll
- scrrun.dll
- msxml.dll
Чтобы зарегистрировать DLL, вам необходимо выполнить следующие шаги:
- Нажмите кнопку Пуск и выберите пункт Выполнить.
- Далее, в поле Открыть введите следующую команду и нажмите Enter, чтобы зарегистрировать библиотеку DLL
regsvr32 DLLFilename
Когда я запускаю команды “Rundll32.exe shdocvw.dll, DoOrganizeFavDlg” появляется пустое диалоговое окно, вместо списка любимых веб-сайтов.
Когда вы запустите команды Rundll32.exe shdocvw.dll, DoOrganizeFavDlg на компьютере с Windows XP и с Internet Explorer 8, установленном на ней,должен быть показан список ваших любимых веб-сайтов . Если вы получили пустое диалоговое окно, для устранения проблемы скачайте самое накопительное обновление безопасности Internet Explorer для Windows на веб-сайте Microsoft Update .
Кроме того, вы можете запустить команды Rundll32.exe ieframe.dll, DoOrganizeFavDlg для просмотра избранного информации.
Файл shadocvw.dll отсутствует — что нужно я должен делать?
Для решения проблемы, скачайте копию файла shadocvw.dll из надежных онлайн DLL каталогов и сохраните файл в папку C:WindowsSystem32 .
- Распечатать
Оцените статью:
- 5
- 4
- 3
- 2
- 1
(0 голосов, среднее: 0 из 5)
Поделитесь с друзьями!
-

wasm_test
wasm test user
- Публикаций:
-
0
- Регистрация:
- 24 ноя 2006
- Сообщения:
- 5.582
Кросспост из моего блога http://the-gr8.cih.ms/2010/01/blog-post_7649.html
![[IMG]](http://s57.radikal.ru/i156/1001/7a/669c33abdffc.png)
Всем знакомое назойливое окошко позволяет вызвать just-in-time отладчик, но самое обидное, что этот отладчик может быть только один единственный. А мне вот захотелось иметь возможность выбора между отладчиками — запустить олли, WinDbg или же создать минидамп с помощью ntsd.
![[IMG]](http://s57.radikal.ru/i155/1001/4f/1debd141f907.png)
Список отладчиков хранится в подключах HKLMSoftwareMicrosoftWindows NTAeDebug в виде подключей «0», «1», «2», …
default value в них — путь к отладчику, а значение Name — отображаемое имя.
Добавить новый можно с помощью regedit. По умолчанию выбирается отладчик «0», имейте в виду, когда будете составлять список.Список параметров (мини-хелп):
* -i установка. Старый отладчик ставится в список нулевым HKLMSoftwareMicrosoftWindows NTAeDebug с названием «Default» (если оно свободно, если занято, то ничего не меняется — на случай установки поверх уже установленного). Так же это можно юзать, если какой-то другой отладчик «занял» место jitmgr, тогда он восстановит себя в качестве jit отладчика. Параметр Auto меняется на 1 — окно dwwin более не отображается (его заменяет окошко jitmgr с расширенной информацией и выбором отладчика).
* -u uninstall. Нулевой отладчик из списка ставится на место jitmgr.
* %ld %ld параметры для вызова как jit. Первый — Process ID, второй — Event Handle. Так же может быть третий параметр — —log. В этом случае jitmgr логирует свой собственный отладочный вывод DbgPrint в jitmgr.log в корень системного диска. Рекомендуется установить этот флажок — jitmgr иногда лажает с определением EXCEPTION_RECORD. Эти файлы в случае фейла jitmgr (покажет messagbox) прошу присылать мне:![[IMG]](http://i061.radikal.ru/1001/9f/9db15c32879b.png)
Отдельного внимания заслуживает поиск EXCEPTION_RECORD* указателя в рухнувшем процессе. Для этого вкратце опишу механизм работы стандартного UnhandledExceptionDispatcher:
* если параметр Auto==0, то подгружается faultrep.dll и вызывается ее ф-я ReportFault
* ReportFault создает секцию с информацией об исключении и запускает dwwin.exe -x -s SectionHandle, который отобржает окно «xxx has encountered a probled and needs to close» с кнопками Debug и Close (кнопка Send у меня отключена
.
* при нажатии Debug ReportFault() возвращает определенное значение, по которому UnhandledExceptionFilter запускает процесс по пути из реестра параметр AeDebugDebugger, передавая в параметры PID и хендл евента, который отладчик должен сигнальнуть по окончании (видимо, для корректного завершения процесса).
* UnhandledExceptionFilter делает ZwWaitForMultipleObject() на объектах процесса отладчика (на случай, если он завершится, так и не сигнальнув евент) и на евенте. По причине ожидания на процессе отладчика, jitmgr не завершается, пока не отработает запускаемый отладчик, иначе завершение jitmgr потенциально может убить рухнувший процесс, если отладчик решит его разморозить. Впрочем, он тогда и евент отсигналит, но в любом случае надо повисеть, пока дочерний отладчик не приаттачится, иначе он не успеет за завершающимся процессом.Поскольку UnhandledExceptionFilter thread-safe функция, во время ожидания на евенте и процессе отладчика в других потоках могут возникнуть каскадные исключения, являющимися следствиями первого или имеющими общую причину. Поэтому даже нажатие на Close в окне dwwin не всегда завершает процесс (многие замечали?). Вероятно, он просто сигналит евент и завершается. Для предотвращения этого у меня в jitmgr а) на время работы jitmgr оборачивается в ZwSuspendProcess/ZwResumeProcess, замораживая процесс и б) есть кнопка «Kill Process», которая насильно убивает процесс сразу же.
Алгоритм поиска EXCEPTION_RECORD:* перебрать все потоки, найти потоки, у которых State == THREAD_STATE_WAIT
* для каждого потока в состоянии ожидания получить контекст, прочитать содержимое стека по адресу Context.Ebp, которое в случае вызова из UnhandledExceptionFilter должно иметь следующую раскладку (подчеркиваю — содержимое по EBP. По ESP будет адрес возврата в ZwWaitForMultipleObjects):1. (ebp+0) old EBP
2. (ebp+4) адрес возврата из UnhandledExceptionFilter в фильтр исключений SEH (блок __try/__except) функции BaseThreadStart или BaseProcessStart
3. (ebp+8) указатель на EXCEPTION_POINTERS — первый параметр UEF.* найти базу kernel32.dll в дочернем процессе через раскрутку SEH: я никогда не видел Address Space Layout Randomization (ASLR), поэтому предположил, что это сработает

* проверить, что *(ebp+4) принадлежит кернелу (еще можно проверить, что *esp — адрес возврата в ZwWaitForMultipleObjects действительно указывает туда, но это, имхо, уже лишнее; также можно проверить, что *ebp и *(ebp+8) принадлежат стеку этого потока)
* проверить, что по адресу *(ebp+4)-5 действительно расположен call UnhandledExceptionFilter
* в случае успеха всех условий, прочитать **(ebp+8) — указатель на EXCEPTION_RECORDЗамечания и критика приветствуются. Выводится инфа в OutputDebugString (смотреть в DbgView), в случае ошибки поиска EXCEPTION_RECORD инфа дублируется в jitmgr.log — прошу высылать этот файл, если будет такая ошибка.
P.S. Раньше была кнопочка Minidump (между Debug и KillProcess), но была выпилена по причине, что проще добавить ntsd явно в список отладчиков.
P.P.S. Была мысля добавить автодобавление нового отладчика при указании пути к exe и выборе типа отладчика (чтобы автоматом дописывались параметры для известных отладчиков).Исходники и EXE в аттаче
-

wasm_test
wasm test user
- Публикаций:
-
0
- Регистрация:
- 24 ноя 2006
- Сообщения:
- 5.582
В догонку еще один кросспост из моего блога насчет отладчика ntsd и генерирования дампов:
Все слышали про kd/windbg? Думаю, многие. Но немногие знают, что есть так же и хороший аналогичный отладчик ntsd (NT Symbolic Debugger) для юзермодных программ. Старая версия его даже входит в Windows по умолчанию (%systemroot%system32ntsd.exe). Нормальная версия поставляется в Debugging Tools for Windows вместе с kd/WinDbg.
Интерфейс — мощный текстовый, как у kd. Команды аналогичны kd при работе в юзер моде.
Одна из полезных команд — !analyze -v (как для ядра), делает анализ исключения. Вместе с возможностью аттачиться к процессам в режиме just-in-time и генерацией минидампа — весьма заманчиво.
Отладчик поддерживает скрипты, что делает его еще более заманчивым.
Есть так же поддержка отладки по сети (ключ -remote).Примеры:
* ntsd -p PID — Аттачнуться к процессу по его PID. Так же можно добавить параметр -g (Auto ‘Go’ — автоматически выполнит Go, не брякаясь в процессе).
* ntsd -p PID -e EVENTHANDLE — используется для Just-In-Time отладки, второй параметр — event handle, который нужно сигналить, чтобы «разморозить» упавший процесс, который ждет отладчика (там выполняется ZwWaitForMultipleObjects на хендлах евента и процесса отладчика).
* Опция -с позволяет написать список команд для выполнения при старте. Например -c «.dump C:Dumpsjit.dmp;q» сгенерирует минидамп по указанному пути и завершит отладчик. Можно использовать в just-in-time вместе с опцией -noio, которая подавляет показ консольного окна. В саму .dump можно добавить флаг /u, который сделает имя дампа уникальным в виде jit_046C_2010-01-06_03-15-26-921_06D8.dmp и /ma, которая будет генерировать расширенный дамп. Весьма полезно для тех случаев, когда комп тестится на машине тестера и нужно узнать инфу об исключении.
* Ключики как в kd/WinDbg: -y указывает путь к символам, -z путь к крешдампу, который надо загрузить.Just-In-Time
Как я уже говорил, его можно прописать в just-in-time отладку, чтобы упавшим программам генерился минидамп, или, например, выполнялся определенный скрипт — ограничения навязаны только полетом фантазии.
Для этого надо прописать примерно следующее в HKLMSoftwareMicrosoftWindows NTCurrentVersionAeDebugDebugger:
ntsd -p %ld -e %ld -g -noio -c «.dump /u /ma C:jit.dmp;q»
Можно и не делать это вручную, в JIT его прописывает свитч -iae.Поскольку хочется иметь одновременно еще и «гуйный» отладчик, например, Olly, нужно иметь возможность выбора JIT-Отладчика. Об этом мой следующий пост (про мою софтинку jitmgr).
http://www.opferman.net/Text/ntsd.txt — некоторая инфа про отладку в нем.
-

n0name
New Member
- Публикаций:
-
0
- Регистрация:
- 5 июн 2004
- Сообщения:
- 4.336
- Адрес:
- Russia
jit’ом регаешь свой fault.exe ?
-

wasm_test
wasm test user
- Публикаций:
-
0
- Регистрация:
- 24 ноя 2006
- Сообщения:
- 5.582
n0name
fault.exe делает mov dword [12345678], ABCDEF01
диалог просто сообщает, что она выполнила некорректную операцию. как окно dwwin, только информативнее и с возможностью выбора отладчика. Добавил картинку для сравнения (начало 1 поста) -

wasm_test
wasm test user
- Публикаций:
-
0
- Регистрация:
- 24 ноя 2006
- Сообщения:
- 5.582
Обновил софтинку.
Changelog for v0.2:
* изменен алгоритм поиска EXCEPTION_RECORD. Тут сказали, что в случае ASLR база длл в каждом процессе одинакова + я убрал проверку, что адрес возврата из UEF лежит в kernel32 — он может лежать в любом месте, поскольку можно установить сех и в обработчике вызвать UnhandledExceptionFilter — все равно будет запущен dwwin. Поэтому убрана эта проверка и добавлена проверка, что адрес возврата *esp == ZwWaitForMultipleObjects+0x0c (UEF вызывает ZwWaitForMultipleObjects для ожидания на объектах процесса отладчика и синхронизируещего евента).-
HMODULE hNtdll = GetModuleHandle («ntdll.dll»);
-
PVOID pZwWaitForMultipleObjects = GetProcAddress (hNtdll, «ZwWaitForMultipleObjects»);
-
// Zw service has the following code:
-
// [ZwXXX+00] MOV EAX, (ServiceNumber)
-
// [ZwXXX+05] MOV EDX, 7FFE0300 ; ServiceCall
-
// [ZwXXX+0A] CALL DWORD PTR DS:[EDX]
-
// [ZwXXX+0C] RETN (argumentSize)
-
// ReturnAddress should be ZwWaitForMultipleObjects+0c (address of RETN)
-
ULONG_PTR ReturnAddress = 0;
-
ReadProcessMemory (hProcess, (LPCVOID)ctx.Esp, &ReturnAddress, sizeof(ULONG_PTR), &BytesRead);
-
if (ReturnAddress — 0x0c == (ULONG_PTR)pZwWaitForMultipleObjects)
* поправлена небольшая ошибка с ведением лога
