|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Исходный код функции на Delphi Код: pascal 1. 2. 3. 4. 5.
Объявление в Код: c# 1. 2.
На выходе получаю ошибку: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. Что можно сделать чтобы это побороть? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 14:26 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha, а в Дельфийском то коде точно все правильно? Плюс, проверьте что разрядность библиотеки совпадает с разрядностью managed проекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 14:43 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Factorize, Код дельфийской функции я привел в посте выше. Все компилируется под одним 4 фреймворком для 32 разрядной платформы. Если все скомпилировать под 2 фреймворком, то все работает без проблем. Куда копать я уже не знаю совсем :( ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 14:56 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha, Вы привели только часть кода. StatusBuf может быть неверно инициализирована. В свою очередь, неправильно инициализирована она может быть и по каким-то внешним причинам. Если дело не в этом, то я бы посмотрел в документации, какая разница в Pinvoke между .Net 2.x и 4.х, могли "правила игры" измениться. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 15:26 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha, может в вызове метода указать размерность int-а? Ну, например : public static extern int GetStatusNum(Int32 byte1); А вообще, Вы уверены, что массив StatusBuf инициализирован? Кроме того, зачем по воробьям из пушки палить, передавая в функцию тип Integer, когда достаточно будет просто byte? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 15:31 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Alex KuznetsovPavluha, может в вызове метода указать размерность int-а? Ну, например : public static extern int GetStatusNum(Int32 byte1); в .Net тип int всегда 32х битный. Не нужна тут никакая размерность. Alex KuznetsovКроме того, зачем по воробьям из пушки палить, передавая в функцию тип Integer, когда достаточно будет просто byte? Не советуйте человеку всякие методы написания извращенного кода. Типичный bad practice. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 15:36 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Alex Kuznetsov, Пробовал ставить Int16 и Int32, толку 0. Дело в том, что некоторые методы работают, а некоторые нет. Вообще непонятно с чем все связано. Просто беда ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 15:51 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Не подскажите почему в дебаге такая ошибка происходит на вызов этого Marshal.FreeHGlobal(pfield); Сама ошибка: This may be due to a corruption of the heap, which indicates a bug in METRO.exe or any of the DLLs it has loaded. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 17:03 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Вот добился я, что на моей машине все работает корректно, но толку. Пошел на 32 разрядную винду, запустил и все фатал полный. Что за х... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 17:06 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Factorize FactorizeAlex KuznetsovКроме того, зачем по воробьям из пушки палить, передавая в функцию тип Integer, когда достаточно будет просто byte? Не советуйте человеку всякие методы написания извращенного кода. Типичный bad practice.Поясните, пожалуйста, почему же это будет методом написания извращённого кода, и как Вы определили, что это "Типичный bad practice" ? Хочется узнать экспертное мнение. Хочется узнать ответ именно от Вас, а не отсылания в гугл и т.д. Может чего нового для себя открою. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 19:41 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
PavluhaНе подскажите почему в дебаге такая ошибка происходит на вызов этого Marshal.FreeHGlobal(pfield); Сама ошибка: This may be due to a corruption of the heap, which indicates a bug in METRO.exe or any of the DLLs it has loaded. не факт, что насрано имено в вызове GetStatusNum ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2014, 19:59 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, так метод то все возвращает, что нужно и посмле этого я хочу освободить ресурс. Вот код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 09:37 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha, причина где-то раньше или в _GetFldStr зы pstr не освобождается ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 09:45 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, И вариантов решения нет что ли никаких? Если поставить вот такую строчку Код: c# 1.
, то ошибка на ней происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 09:48 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluhaто ошибка на ней происходит. как выделяется память для результата в _GetFldStr ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 09:53 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, Никак, код я привел. Я получаю ссылку, а потом маршалю этим методом Marshal.PtrToStringAnsi ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 09:54 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
PavluhaИзопропил, Никак, код я привел. Я получаю ссылку, а потом маршалю этим методом Marshal.PtrToStringAnsi не виду кода на дельфи ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 09:58 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, тут я не могу помочь, библиотека не моя. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 10:03 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha, вызов _GetFldStr - первое обращение к библиотеке? память испорчена где-то раньше ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 10:15 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, Нет не первый вызов, вызовы до этой команды уже были. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 10:24 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha, Были вызовы этого метода: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 10:30 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
PavluhaНет не первый вызов, вызовы до этой команды уже были. там и повреждения сделаны чудес не бывает для вызова _GetFldStr ручной маршаллиг излишен, достаточно [MarshalAs(UnmanagedType.LPStr)] string field подозреваю, что и в других вызовах много чего наворочено - оттуда и ошибки ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 10:31 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, Я так делал раньше [MarshalAs(UnmanagedType.LPStr)] , но при такой реализации вылазила ошибка FatalExecutionEngineError: The runtime has encountered a fatal error. The address of the error was at 0x6f4293ba, on thread 0x22f0. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 10:59 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
до этого вызова ошибки сделаны ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 11:18 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, Нет, до этого момента ошибок нет. Я короче сделал так: Код: c# 1. 2. 3. 4.
теперь работает и у меня и на 32 разрядной, но я уверен ошибки периодически возникают Отсюда вопрос, чем это грозит? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 11:36 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
PavluhaНет, до этого момента ошибок нет. они просто не проявились ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 11:43 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha... но я уверен ошибки периодически возникают Отсюда вопрос, чем это грозит?Грозить это может потерей данных. Для понимания что, где и когда может ломаться, приводите весь код с первого вызова, до того, где происходит ошибка. И ещё конечно, объявления функций библиотеки. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 13:15 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Alex KuznetsovFactorize Factorizeпропущено... Не советуйте человеку всякие методы написания извращенного кода. Типичный bad practice.Поясните, пожалуйста, почему же это будет методом написания извращённого кода, и как Вы определили, что это "Типичный bad practice" ? Хочется узнать экспертное мнение. Хочется узнать ответ именно от Вас, а не отсылания в гугл и т.д. Может чего нового для себя открою. За такой код нужно бить по рукам. Использование byte вместо int - это потенциальный баг замедленного действия. Системы имеют свойство развиваться, и за byte значение рано или поздно переползет. Я не раз и не два видел такой баг в продакшене. Второе - использование byte наведет на мысль, что она для чего-то тут нужен, только сбивает столку. Вы пишите, что это стрельба по воробьям - но в чем она состоит то? Это микрооптимизация. Что она есть, что ее нет - все работает одинаково. За такие оптимизации на языках высокого уровня, если они проводятся без особой надобности, нужно бить по рукам. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 18:29 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
PavluhaВот добился я, что на моей машине все работает корректно, но толку. Пошел на 32 разрядную винду, запустил и все фатал полный. Что за х... Блин, да это стопудофф с разрядностью у вас нелады. Проверьте, чему у вас равен авторIntPtr.Size.. IntPtr - это коварный тип, внутри сидит указатель разного размера. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.05.2014, 18:43 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Factorize...Использование byte вместо int - это потенциальный баг замедленного действия. Системы имеют свойство развиваться, и за byte значение рано или поздно переползет. Я не раз и не два видел такой баг в продакшене. Да, такое возможно, только тогда нужно избавиться от магических чисел [1..6] в коде, т.е. переработать немного архитектуру. FactorizeВторое - использование byte наведет на мысль, что она для чего-то тут нужен, только сбивает столку. Вы пишите, что это стрельба по воробьям - но в чем она состоит то? Это микрооптимизация. Что она есть, что ее нет - все работает одинаково. За такие оптимизации на языках высокого уровня, если они проводятся без особой надобности, нужно бить по рукам. Про микрооптимизацию согласен, исследования ассемблерного кода вот такого примера: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Посему признаю свою ошибку. Честно, думал, что для вычисления адреса просто применят add . ... |
|||
:
Нравится:
Не нравится:
|
|||
23.05.2014, 09:15 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
У коллег использующих библиотеку возникла ошибка чтения\записи в защищенную память при запуске проекта, как релиз. Но, если запустить проект по админом ошибки нет. =-O С чем это может быть связано? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2014, 13:41 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Я нашел откуда ноги растут: Вот этот метод бьет память: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Если закомментарить этот кусок кода: Код: c# 1. 2.
То ошибки не возникает, но тогда я память не освобождаю. Как быть? В дебаге на этих методах происходит ошибка: This may be due to a corruption of the heap, which indicates a bug in or any of the DLLs it has loaded. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2014, 14:42 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha, pfield - можно и освободить. с pstr - дела хуже, маловероятно, что GetFldStr возвращает память, выделенную GlobalAlloc значит будет утекать ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2014, 14:48 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, Как я понял, беда вообще в том, что я пустую строку передаю, от этого и все проблемы. Вот описание метода 2-й параметр вообще непонятно что такое и что в него передавать. Если я правильно понимаю, то ссылку на обл куда будет сохранено значение. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2014, 15:00 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Pavluha2-й параметр вообще непонятно что такое и что в него передавать. Если я правильно понимаю, то ссылку на обл куда будет сохранено значение. как раз теперь понятно - это блок памяти, в который помещается результат и адрес этого блока возвращается функцией выделить память под второй параметр с запасом, вызвать, проверить результат на Zero, скопировать строку, освободить память(один единственный раз) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2014, 15:44 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
Изопропил, Так и сделал, все заработало. Просто есть методы, которые возвращаю буфер макс размером 32000. И сколько под такое резервировать тогда? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2014, 15:55 |
|
Попытка чтения или записи в защищенную память.
|
|||
---|---|---|---|
#18+
PavluhaИзопропил, Так и сделал, все заработало. Просто есть методы, которые возвращаю буфер макс размером 32000. И сколько под такое резервировать тогда? если узнать заранее невозможно - всегда резервируйте максимум 32000 - это не так много PS ну и освобождать нужно в блоке finally ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2014, 16:22 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1402825]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
73ms |
get tp. blocked users: |
1ms |
others: | 322ms |
total: | 482ms |
0 / 0 |