Как определить, почему задача уничтожает VxWorks?

У меня есть приложение VxWorks, работающее на ARM uC.

Сначала позвольте мне подытожить приложение;

Приложение состоит из стороннего стека и шлюзового приложения. Мы реализовали уровень абстракции операционной системы для поддержки независимости от ОС.

Базовый стек имеет собственное средство управления и контроля памяти, которое содержит блоки памяти в двусвязном списке.

Например ; мы не выполняем напрямую malloc/new , free/delege . Вместо этого мы вызываем подпрограммы уровня OSA, и он получает память от ОС и помещает ее в список, а затем возвращает эту память приложению (подпрограммы: XXAlloc , XXFree, XXReAlloc)

А при освобождении памяти снова используем XXFree.

На самом деле этот блок представляет собой структуру, которая имеет

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

С помощью этой блочной структуры стек может проверить, поврежден блок или нет.

Также у нас есть библиотека pthread, перенесенная из Linux, которую мы используем для -создания/завершения потоков (в настоящее время существует 22 потока) -объектов синхронизации (события, мьютексы...)

Основная задача вызывается taskSpawn, а позже эта задача создала другие потоки.

это было описание приложения и его интерфейса VxWorks.

Проблема в :

одна из задач внезапно уничтожается VxWorks, не давая никакой информации о том, что не так. У меня также есть отладчик jtag, и он попадает в процедуру VxWorks taskDestoy(), но стек вызовов не дает никакой информации ни на ПК, ни на r14.

Я с подозрением отношусь к конкретной процедуре в коде, где выполняется огромный xxAlloc, но проблема возникает очень спорадически, не давая понять, что я могу сопоставить ее с исходным кодом.

Я думаю, что ОС обнаруживает исключение и выполняет его обработку молча.

любая помощь будет здорово

С Уважением


person tguclu    schedule 27.07.2009    source источник
comment
предложение немного переформатировать вопрос: формулировка проблемы в начале и справочная информация после этого. Таким образом, читателям не нужно читать всю историю, чтобы выяснить, соответствует ли она.   -  person Adriaan    schedule 06.08.2009


Ответы (3)


Это разрешилось.

Я провел изолированный тест. Выделил 20 МБ с помощью malloc и memset с 0x55 и остановил поток моего приложения.

И я написал еще один поток, который проверяет мои 20 МБ, если записаны какие-либо данные, кроме 0x55.

И угадай что!! какой-то другой поток, который принадлежит другим компонентам в ЦП (кто-то их разработал), записывает мое выделенное пространство.

Спасибо 4 ваша помощь

person tguclu    schedule 15.08.2009
comment
И теперь вы можете принять ответ и удалить свой вопрос из списка без ответа ;) - person zxcat; 04.09.2009

Если ваша задача завершается, вызывается taskDestroy(). Если вы подозреваете огромный xxAlloc, убедитесь, что код выделения не вызывает exit() при исчерпании памяти. Я был укушен таким поведением в стороннем OSAL раньше.

person bstpierre    schedule 27.07.2009
comment
Другая аналогичная возможность заключается в том, что точка входа задачи просто возвращается. (Или функция, подобная выходу, называется... abort()?) Я также видел такое поведение в случае повреждения или переполнения стека. - person bstpierre; 28.07.2009

Похоже, вы отлаживаете после интеграции; это может быть адской работой. Предлагаю разбить проблему на более мелкие части.

Процесс

1) вы можете получить больше информации, инструментируя код и/или используя инструменты VxWorks (в зависимости от версии). Это позволяет получить больше информации о том, что происходит. Обязательно записывайте все в файл, чтобы вернуться во времени с момента завершения задачи. Инструментарий — это выгодное вложение, так как оно пригодится в большем количестве случаев. Интересные хуки в VxWorks: Taskooklib

2) выделение/освобождение памяти - очень фундаментальная функциональность. Это был бы мой первый кандидат на тщательное (модульное) тестирование в четко определенной многопоточной среде. Если вы это сделали и ошибок не обнаружено, я бы сначала начал смотреть, почему закончился тас.

другие возможные причины

Задача также завершится, когда работа будет выполнена... так что это может быть возврат, вызванный не таким уж бесконечным циклом. Особенно, если это всегда одна и та же задача, это мое предположение.

И некоторые версии VxWorks имеют поддержку MMU, которую необходимо учитывать.

person Adriaan    schedule 06.08.2009