Где хранятся данные и как осуществляется доступ к этим двум процессам?
Если структура была выделена из кучи, попробуйте выделить гораздо больший блок и поставить большие защитные зоны до и после структуры. Это должно дать вам представление о том, является ли это одним из окружающих распределений кучи, которое переполнено тем же распределением, что и ваша структура. Если вы обнаружите, что память, окружающая вашу структуру, не затронута, и только сама структура повреждена, это указывает на то, что коррупция вызвана тем, что имеет некоторое знание местоположения вашей структуры, а не случайную память.
Если структура находится в разделе данных, проверьте выход карты компоновщика, чтобы определить, какие другие данные существуют в непосредственной близости от вашей структуры. Проверьте, были ли они повреждены, ввести защитные зоны и проверить, следует ли проблема следовать структуре, если вы вынуждаете ее перемещаться в другое место. Опять же это указывает на то, что коррупция вызвана чем-то знанием местоположения вашей структуры.
Вы также можете проверить это, переключив данные из кучи в секцию данных или наоборот.
Если вы обнаружили, что структура больше не повреждена после перемещения ее в другом месте или введения защитных зон, вы должны проверить карту компоновщика или отслеживать кучу, чтобы определить, какие другие данные находятся поблизости, и проверить доступ к этим областям для переполнение буфера.
Возможно, вы обнаружите, что проблема не соответствует структуре, где бы она ни находилась. Если это так, тогда проверяйте весь код, окружающий ссылки на структуру. Проверьте содержимое до и после каждого доступа.
Чтобы проверить, вызвано ли повреждение другим процессом или обработчиком прерываний, добавьте крючки в каждый переключатель задачи и до и после вызова каждого ISR. Крючок должен проверить, было ли содержимое повреждено. Если они есть, вы сможете определить, какой процесс или ISR несет ответственность.
Если структура всегда считывается в стек локального процесса, попробуйте увеличить стек процесса и убедитесь, что не произошло переполнения массива и т. Д. Даже если он не читается в стеке, вероятно, в какой-то момент у вас будет указатель на него в стеке. Проверьте все подфункции, вызываемые в окрестности, на проблемы стека или аналогичные, которые могут привести к ошибочному использованию указателя несвязанными блоками кода.
Также рассмотрите вопрос о том, может ли быть поврежден компилятор или RTOS. Попробуйте отключить оптимизацию компилятора и не сможете проверить генерируемый код. Аналогичным образом рассмотрим, может ли это быть из-за неисправного контекстного переключателя в вашей собственной ОСРВ.
И, наконец, если вы используете память другого устройства или процессора, и у вас включен кеш данных, убедитесь, что вы позаботились об этом, используя неэкранированные обращения или аналогичные стратегии.
Фактически повреждение памяти обнаруживается в структуре. Так что я занимаюсь наблюдением за этой структурой, когда она создана и заполнена. На этом этапе все кажется хорошим. но когда другой процесс смотрит на эту структуру, он получает поврежденные данные, поэтому я пришел к выводу, что в этом месте есть другой процесс записи. Я также упоминаю, что приложение работает над интерпретатором, и даже если приложение вылетает, интерпретатор отлично справляется с этим. также обратите внимание, что проблема систематическая, поэтому я не думаю, что это шанс. – 2009-11-05 22:05:28
C, интерпретируемая и разделяемая память? Я думаю, вам нужно добавить намного больше деталей к своему оригинальному вопросу! – Will