Моя задача отлавливает ошибку:Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Но ведь место где она ее отлавливает — не место ошибки, а место ее проявления.
Существуют ли какието методики, средства для поиска таких ошибок?
Ситуация осложняется тем, что отлавливатеся ошибка спонтанно.
P.S. Использую смешанный код. C++/CLI
Re: Attempted to read or write protected memory. This is oft
Здравствуйте, hooky-mars, Вы писали:
HM>Всем привет!
HM>Моя задача отлавливает ошибку:Attempted to read or write protected memory. This is often an indication that other memory is corrupt. HM>Но ведь место где она ее отлавливает — не место ошибки, а место ее проявления. HM>Существуют ли какието методики, средства для поиска таких ошибок? HM>Ситуация осложняется тем, что отлавливатеся ошибка спонтанно.
HM>P.S. Использую смешанный код. C++/CLI
Есть замечательная но стоящая денег тулза BoundChecker здесь.
Также стандартная библиотека имеет возможности по диагностированию проблем работы с памятью здесь.
Но в твоем случае, если это твой код сбоит, ты где-то напутал с адресами. Попробуй раскрутить стек, и внимательно изучить все операции выполняемые с памятью.
Re[2]: Attempted to read or write protected memory. This is
A>Но в твоем случае, если это твой код сбоит, ты где-то напутал с адресами. Попробуй раскрутить стек, и внимательно изучить все операции выполняемые с памятью.
Стек раскрутить не получится, так как код смешанный.
Re[3]: Attempted to read or write protected memory. This is
Здравствуйте, hooky-mars, Вы писали:
A>>Но в твоем случае, если это твой код сбоит, ты где-то напутал с адресами. Попробуй раскрутить стек, и внимательно изучить все операции выполняемые с памятью. HM>Стек раскрутить не получится, так как код смешанный.
Кстати, если код смешанный, возможно вмешивается сборщик мусора, и делает указатели не действительными.
Re[4]: Attempted to read or write protected memory. This is
Здравствуйте, hooky-mars, Вы писали:
A>>Кстати, если код смешанный, возможно вмешивается сборщик мусора, и делает указатели не действительными. HM>ИМХО, это домыслы
То что в смешанном коде сборщик мусора может может повредить память — это факт. Могу даже объяснить почему, если не веришь. А произошло ли это у тебя, конечно домыслы. Такую ошибку можно получить очень многими способами.
Re[6]: Attempted to read or write protected memory. This is
Просто я считаю сборщик мусора достаточно умной штукой чтобы она не лезна в неуправляемую память.
Разве что, если (как кимто образом) я попорчу ссылки у мусорщика, ну дык какая разница?
A>То что в смешанном коде сборщик мусора может может повредить память — это факт. Могу даже объяснить почему, если не веришь. А произошло ли это у тебя, конечно домыслы. Такую ошибку можно получить очень многими способами.
Было бы интересно почитать Ваше объяснение...
Ведь это просиходит не с самого начала, а после какогото изменения модуля....
У меня несколько раз возникали подозрения на мусорщик, но каждый раз оказывалось, что это была моя вина.
Так что придпочитаю домать, что ошибка всеже моя
Re[7]: Attempted to read or write protected memory. This is
Здравствуйте, hooky-mars, Вы писали:
HM>Просто я считаю сборщик мусора достаточно умной штукой чтобы она не лезна в неуправляемую память. HM>Разве что, если (как кимто образом) я попорчу ссылки у мусорщика, ну дык какая разница?
A>>То что в смешанном коде сборщик мусора может может повредить память — это факт. Могу даже объяснить почему, если не веришь. А произошло ли это у тебя, конечно домыслы. Такую ошибку можно получить очень многими способами. HM>Было бы интересно почитать Ваше объяснение...
HM>Ведь это просиходит не с самого начала, а после какогото изменения модуля.... HM>У меня несколько раз возникали подозрения на мусорщик, но каждый раз оказывалось, что это была моя вина. HM>Так что придпочитаю домать, что ошибка всеже моя
Да, он в не управляемую память не лезет. Но возможен такой сценарий. Вы выделяете память в управляемом коде (Ref1). Дальше указатель на эту память передаете модулю написанному на неуправляемом языке (Ptr1). Потом сборщик мусора решает почистить немного память и перераспределить ее. Т.е. ссылка Ref1 уже будет указывать на Ptr2. Управляемый код с этой памятью будет работать абсолютно нормально. А вот Ptr1 теперь указывает непонятно на что. И попытка доступа к этому участку памяти из неуправляемого кода может вызвать ошибку. В C# есть синтаксис для фиксации таких участков памяти. Но я не спец в C#, поэтому волшебное слово подсказать не смогу.
Re[8]: Attempted to read or write protected memory. This is
A>Да, он в не управляемую память не лезет. Но возможен такой сценарий. Вы выделяете память в управляемом коде (Ref1). Дальше указатель на эту память передаете модулю написанному на неуправляемом языке (Ptr1). Потом сборщик мусора решает почистить немного память и перераспределить ее. Т.е. ссылка Ref1 уже будет указывать на Ptr2. Управляемый код с этой памятью будет работать абсолютно нормально. А вот Ptr1 теперь указывает непонятно на что. И попытка доступа к этому участку памяти из неуправляемого кода может вызвать ошибку. В C# есть синтаксис для фиксации таких участков памяти. Но я не спец в C#, поэтому волшебное слово подсказать не смогу.
О такой ситуации я вкурсе. А волшебное слово так и есть fixed, токмо оно работает в приделах метода, т.е. обявляется:
fixed (чаго то фиксим)
{
Чаго то делаем
}
Но в С++/CLI ситуация другая. Спасибо за мысль! Порою в этом направлении.