Руководства, Инструкции, Бланки

Инструкция По Адресу 0x5c44e09a Обратилась По Адресу

Категория: Инструкции

Описание

Инструкция 0х0000000 обратилась по адресу 0х0000000

инструкция 0х0000000 обратилась по адресу 0х0000000

написал прогу:
основная программа читает конфиг и запускает поток, тот грузит DLL-ки и по завершении работы их выгружает.
потом перенес это в сервис и при останове вылетает сакраментальное "инструкция 0х0000000 обратилась по адресу 0х0000000 память не может быть "read"".
В чем прикол может быть?


> В чем прикол может быть?

"Прикол" в том, что нужно заняться трассировкой/отладкой сервисного приложения. Само по себе (без отладки) ни одно приложение, ни у кого и никогда не заработает как положено.

Умные, да? Про отладку я и так знаю не надо мне философию разводить.
Я знаю что ошибка с этими адресами инструкции и памяти 0х0000000 - довольно специфическая и где-то я читал про нее а вспомниить не могу


> ошибка с этими адресами инструкции и памяти 0х0000000 -
> довольно специфическая

что ж в этом "специфического". imho, нет ничего "специфического".


> Про отладку я и так знаю не надо мне философию разводить

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

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

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

2 Reystlin
Аналогично!

procedure TASMThread.FreeLibraries;
var
i. integer;
j. LongBool;
begin
log.Write(elDebug,["Unloading converters"]);
try
for i:=0 to CvrList.Count-1 do begin
try
j := FreeLibrary(HINST(PHANDLE(CvrList.Objects[i])^));
Dispose(PHANDLE(CvrList.Objects[i]));
if j=false then begin
log.Write(elDebug,["failed to unload "+(CvrList[i])]);
end
else begin
log.Write(elDebug,["successfully unloaded "+CvrList[i]]);
end;
except
;
end;
end;
CvrList.Clear;
except
log.Write(elError,["Error unloading converters"]);
end;
log.Write(elDebug,["Converters unloaded"]);
end;


function TASMThread.LoadConverters. boolean;
var
dllList. TStringList ;
i. integer;
proc. TFarProc;
dllHINST. THANDLE ;
p. PHANDLE;
r. pchar ;
j. integer;
begin
log.Write(elDebug,["Loading converters"]);
CvrList.Clear;
try
result := true;
dllList := TStringList.Create ;
FindFiles(DirForDll,"*.dll",dllList);
if dllList.Count>0 then begin
for i := 0 to dllList.Count-1 do begin
try
dllHINST := LoadLibrary(pchar(DirForDll+FNDelim+dllList[i]));
if dllHINST=0 then begin
log.Write(elError,["can""t load "+dllList[i]]);
continue;
end;
proc := GetProcAddress(dllHINST,"GetModuleName");
if proc=nil then begin
log.Write(elError,["procedure GetModuleName not found in "+dllList[i]]);
continue;
end;
r := TGetNameProc(proc);
if r<>nil then begin
new(p);
p^ := DllHINST;
j := CvrList.Add(r);
CvrList.Objects[j] := TObject(p);
Log.Write(elDebug,["loaded "+dllList[i]]);
end;
except
continue;
end;
end;
end
else result := false;
finally
dllList.Free;
end;
end;

Вот загрузка и выгрузка
вот код - где косяк?

Есть осчусчение, что ты передаёшь/получаешь из модуля переменную типа string, а uses sharemem не сделал.

Если интересно - по почте.

Sharemem - первый включаемый модуль в Dll и в проекте,
из Dll получаю строку, но через pchar
а глюк выскакивает только в сервисе в оконном варианте его нет
причем выскакивает он при попытке выгрузки последней Dll - я сначала думал, что Dll глючит и убрал ее из каталога с Dll,но глюк опять выскочил при выгрузке Dll которая стала последней

A zachem takie slozhnosti s New i Dispose?
Pochemu ne AddObject(. Pointer(DllHInst)) ?

про AddObject не знал но сомневаюсь что это что-то меняет

>max2057
А почему вы решили что именно в этих процедурах "косяк"?
Допустим ваша процедура в DLL имеет вид:

function MyFunction(. ): PChar
var
s: string;
begin
.
Result := PChar(s)
end;

а в основной программе идет присвоение результата функции переменной (как у вас в примере) Если "время жизни" s меньше "времени жизни" r (а выгружается библиотека до завеншения программы) то вот тут вы и получите ваш "косяк".

Обычно так, только с небольшим отличеем.

function MyFunction(. ): PChar
var
AnyPointer: string;
begin
AnyFunction(AnyPointer);
end;

У тебя случайно в dll нет нити?
если есть и ты ее перед выгрузкой терминейтишь то все понятно.


> max2057 © (15.04.03 15:37)
> про AddObject не знал но сомневаюсь что это что-то меняет

Delo ne v AddObject. Delo v tom, chto Integer i Pointer---odnogo razmera, tak chto, esli nuzhno hranit" odno Integer (ili Handle), to net smysla vydelyat" pod nego kusok pamyati i hranit" ssylku.

Извините за долгое молчание
я даже переделывал так что dll"ки грузит первичный поток до запуска вторичного но глюк оставался

а запись в лог поставить.
на Process/Thread Attach/Detach ?

Другие статьи

Инструкция по адресу 0x77e76eb1 обратилась к памяти по адресу 0x0000001 - Технический форум

Мне помогло вот это, но правда комп новый был. Во всем, как выяснилось, виновата функция "Предотвращение выполнения данных" (DEP)
Т.к. данная ошибка возникает при обращении какой-либо программы или модуля программы напрямую к закрытому участку памяти.

Аннотация
Предотвращение выполнения данных (Data Execution Prevention, DEP) – это набор программных и аппаратных технологий, позволяющих выполнять дополнительные проверки содержимого памяти и предотвращать запуск вредоносного кода. В операционных системах Windows XP с пакетом обновлений 2 (SP2) и Microsoft Windows XP Tablet PC Edition 2005 функция DEP реализована как на программном, так и на аппаратном уровне.

Основным преимуществом функции DEP является возможность предотвращения запуска вредоносного кода из области данных. Как правило, содержимое стека и кучи по умолчанию не является исполняемым кодом. При аппаратной реализации функция DEP вызывает исключение при запуске кода из указанных местоположений. Функция DEP, реализованная на программном уровне, предотвращает использование вредоносными программами механизма обработки исключений, существующего в Windows.

". в отличие от брандмауэра или антивирусного программного обеспечения функция DEP не препятствует установке потенциально опасных программ на компьютер, а только следит за тем, как программы используют память, и после установки SP2, DEP по умолчанию включена для основных программ и служб Windows."

И немножко комментариев.
Если какая-то программа вызывает срабатывание этой функции, Microsoft рекомендует выбрать режим OptOut и добавить эту программу в список исключений.
Однако зачастую программа состоит не из одного исполняемого модуля, а из многих динамических библиотек, и не всегда имеется возможность точно определить, какая именно вызывает срабатывание DEP.
Если программа вам очень нужна, а добиться ее работоспособности вышеописанным методом не получается, проще отключить DEP целиком, путем редактирования boot.ini.
Хотя, если вероятность возникновения этой ошибки невелика, и если вы не сталкиваетесь с нею, лучше оставить DEP включенной - так система будет больше защищена от возможности выполнения вируса.

Cуществует четыре варианта настройки функции DEP

OptIn Данное значение используется по умолчанию. На компьютерах, оснащенных процессорами с поддержкой DEP, функция DEP включена по умолчанию для ограниченного числа системных файлов и программ. При этом по умолчанию защищаются только системные файлы Windows.

OptOut По умолчанию функция DEP включена для всех процессов. В диалоговом окне Система панели управления можно вручную создать список приложений, для которых следует отключить DEP. Специалисты по информационным технологиям могут воспользоваться пакетом средств обеспечения совместимости приложений (Application Compatibility Toolkit), чтобы отключить функцию DEP для одной или нескольких программ. При этом вступают в силу исправления, обеспечивающие совместимость программ, для функции DEP.

AlwaysOn Функция DEP включается для всей системы. Все процессы работают с выполнением проверок DEP. В этом режиме нельзя отключить функцию DEP для отдельных приложений. Исправления, обеспечивающие совместимость программ, для функции DEP в силу не вступают. Программы, для которых с помощью пакета средств обеспечения совместимости приложений было отключено использование функции DEP, также работают с выполнением проверок DEP.

AlwaysOff Функция DEP отключена для всей системы, независимо от наличия аппаратной поддержки DEP. Процессор не работает в режиме PAE, если в файле Boot.ini не указан параметр /PAE.

Первые два варианта настройки можно переключать с помощью панели управления:
"Система" -> "Дополнительно" -> "Быстродействие" -> кнопка "Параметры" ->
закладка "Предотвращение выполнения данных". (Доп.описание см.по ссылке от
туда.)

Для полного включения или выключения DEP необходимо вручную отредактировать находящийся в корне загрузочного раздела диска скрытый файл boot.ini, добавив в разделе [operating systems] в конец строки ?\WINDOWS="Microsoft Windows XP
Professional" /fastdetect ключ /NoExecute с одной из опций:

NoExecute = OptIn
NoExecute = OptOut
NoExecute = AlwaysOn
NoExecute = AlwaysOff

в итоге должно при отключенном DEP получиться следущее:
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Micro soft Windows XP Professional
SP2" /noexecute=AlwaysOff /fastdetect

Закоулки Интернета: Инструкция по адресу обратилась к памяти по адресу


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

Ошибка инструкция по адресу "***" обратилась к памяти по адресу "***". Память не может быть "read".

Во всем, как выяснилось, виновата функция "Предотвращение выполнения данных"
(DEP).
Т.к. данная ошибка возникает при обращении какой-либо программы или модуля
программы напрямую к закрытому участку памяти.
Краткая компиляция, из Helpa:

". в отличие от брандмауэра или антивирусного программного обеспечения функция
DEP не препятствует установке потенциально опасных программ на компьютер, а
только следит за тем, как программы используют память, и после установки SP2,
DEP по умолчанию включена для основных программ и служб Windows."
И немножко комментариев.
Если какая-то программа вызывает срабатывание этой функции, Microsoft
рекомендует выбрать режим OptOut и добавить эту программу в список исключений.
Однако зачастую программа состоит не из одного исполняемого модуля, а из многих
динамических библиотек, и не всегда имеется возможность точно определить, какая
именно вызывает срабатывание DEP.
Если программа вам очень нужна, а добиться ее работоспособности вышеописанным
методом не получается, проще отключить DEP целиком, путем редактирования
boot.ini.
сталкиваетесь с нею, лучше оставить DEP включенной - так система будет больше
защищена от возможности выполнения вируса.
Cуществует четыре варианта настройки функции DEP
OptIn - (установлено по умолчанию). В этой конфигурации под действие функции DEP
подпадают только основные системные программы и службы.
OptOut - DEP включена для всех процессов и приложений, кроме тех, которые
вручную добавлены пользователем в список исключений.
AlwaysOn - В этом режиме DEP включена всегда для системы в целом, всех процессов
и приложений, не взирая на установки пользователя или производителя ПО.
AlwaysOff - DEP полностью отключена.
Первые два варианта настройки можно переключать с помощью панели управления:
"Система" -> "Дополнительно" -> "Быстродействие" -> кнопка "Параметры" ->
закладка "Предотвращение выполнения данных". (Доп.описание см.по ссылке от
туда.)
Для полного включения или выключения DEP необходимо вручную отредактировать
находящийся в корне загрузочного раздела диска скрытый файл boot.ini, добавив в
разделе [operating systems] в конец строки ?\WINDOWS="Microsoft Windows XP
Professional" /fastdetect ключ /NoExecute с одной из опций:
NoExecute = OptIn
NoExecute = OptOut
NoExecute = AlwaysOn
NoExecute = AlwaysOff
Для редактирования boot.ini нужно в панели управления "Система", на вкладке
"Дополнительно" в разделе "Загрузка и восстановление" нажать кнопку "Параметры"
и в открывшемся окне - кнопку "Правка". Файл boot.ini будет открыт в "Блокноте".
Или: Пуск -> Выполнить -> %systemdrive%\Boot.ini
После редактирования boot.ini не забудьте сохранить этот файл и перезагрузить
компьютер, чтобы изменения вступли в силу.
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional RU" /noexecute=optin /fastdetect
и меняем на
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional RU" /noexecute=AlwaysOff /fastdetect

Инструкция по адресу обратилась к памяти по адресу память не может быть read

DriverPack Forum инструкция по адресу обратилась к памяти по адресу память не может быть read Следить Отписаться просматривают

"Вылечил" винду переустановкой по верх. так называемым обновлением.

Вирусов 99,9999(9)% немого быть.
Не всегда такая ошибка является вирусом или их последствием.
Иногда сбой в реестре или неправильно установленный/обновленный драйвер.

Лично могу доказать - на днях из-за обновления драйвера принтера вылетала служба печати, на нескольких компах с такой же ошибкой.
Лечилось удалением изначальных драйверов в
system32\spool\drivers\w32x86 .

Винда вообще капризная штука.
Тема закрыта.

для того что бы понять что это за ошибка. "инструкция по адресу обратилась к памяти по адресу память не может быть read"

смысл ее в том что какая то программа (не важно в данном случае какая именно)
использует выделенную для нее часть памяти и пытается занять память не по ее рангу. вот тогда система выдает такую ошибку
в подавляющем случае это. коряво написанные вирусы(и то что после них останется в реестре даже после удаления оных ), потом идут твики системы, доморощенными изобретателями этих самых ТВИКЕРОВ (самый главный вирус и вредитель это пользователь ВНИМАНИЕ ! антивирус еще не придуман! )
и на последнем месте сами драйвера (как вы понимаете или несовместимые версии или просто корявые от производителя)

нет не нужно: верю на все 100%. встречался!

Инструкция по адресу обратилась к памяти по адресу Память не может быть written

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

1. Если надпись возникает при работе только с одной программой, возможно, ее стоит переустановить либо найти альтернативную по функциональности приложение.

2. Дефект железа. Обычно предлагается вытащить планки памяти, протереть контакты ластиком и вставить обратно. Кроме того, нужно проверить их какой-нибудь утилитой, нет ли ошибок.
3. На вашем компьютере “поселились” вирусы или трояны. Проверьте систему антивирусом. Можете использовать DrWeb CureIt. бесплатную утилиту, не требующую установки. Но так как программа не умеет обновлять свои базы, то перед применением необходимо скачать последнюю версию.

Возможно, Вам будет полезна эта информация:

4 комментария к ““Инструкция по адресу обратилась к памяти по адресу Память не может быть written/read”. Что это?”

Инструкция по адресу «0×13260048»обратитесь к памяти по адресу «0×0000000».Память не может быть «written»Что делать?

протёр звуковую карту и платы оперативной памяти. включил комп всё автоматически установилось.

что можно сделать, чтобы это окнно не беспокоило? инструкция по адресу «0×7с9101d3» обратилась к памяти по адресу «0x77f69d4a». Память не может быть «written»,

инструкция по адресу «0x0544d09b» обратилась к памяти по адресу «0x05fcb000».Память не может быть «written»

Написать ответ