|
Стек ряпается, Проблемы со стеком |
|
|
|
May 24 2006, 19:51
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Цитата Черканите, когда ... Уважаемый zltigo! Ваша точка зрения ясна. Большое спасибо за помощь.
|
|
|
|
|
May 25 2006, 04:29
|
Участник

Группа: Свой
Сообщений: 24
Регистрация: 21-10-04
Из: Пермь, РФ
Пользователь №: 934

|
Для поиска таких ошибок удобно использовать Hardware Breakpoint (J-Link/MT-Link). Ставишь брык на запись в область памяти и отладка остановится прямо на команде записи. Затем изучаешь Registers/Disassembler
|
|
|
|
|
May 25 2006, 09:00
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Цитата(sapID @ May 25 2006, 07:29)  Для поиска таких ошибок удобно использовать Hardware Breakpoint (J-Link/MT-Link). Ставишь брык на запись в область памяти и отладка остановится прямо на команде записи. Затем изучаешь Registers/Disassembler Ну типа спасибо  Поймите правильно, я некоторое представление об отладке программ имею. В моём случае нужен бряк по изменению содержимого памяти. Подскажите лучше, как RDI по такому условию настроить.
|
|
|
|
|
May 25 2006, 10:49
|

Странник
   
Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051

|
Цитата(Master @ May 25 2006, 00:01)  Уважаемый zltigo! Прежде всего я благодарю Вас за участие и внимание к моей проблеме. Но вынужден заметить, что по-моему дело не в размере/расположении/названии стека - всё это я разумеется могу выдать (кстати по поводу оценки размера стека можно почитать здесь, где Andy Mozzhevilov также озадачивался данной проблемой). Со своей стороны надеюсь, что Вы, давая совет считать размер стека, сами выполняли данную процедуру и готовы поделиться своими успехами. Как то раз были у нас в конторе заскоки со стеком у MB90, долго маялись, в конце концов написал калькулятор стека (кстати, глядя на который Andy Mozzhevilov и затевал разговор) - calc_stk, но и это не помогло, дальнейший тЩательный разбор полетов выявил наезд стека на переменную, теперь все гуд. Это к тому что не стоит отбрасывать ни одну версию до последнего ... и проверять все очень тщательно и свежей/трезвой головой.
--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
|
|
|
|
|
May 25 2006, 12:45
|
Частый гость
 
Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405

|
Цитата(spf @ May 25 2006, 13:49)  Как то раз были у нас в конторе заскоки со стеком у MB90, долго маялись, в конце концов написал калькулятор стека (кстати, глядя на который Andy Mozzhevilov и затевал разговор) - calc_stk, но и это не помогло, дальнейший тЩательный разбор полетов выявил наезд стека на переменную, теперь все гуд. В чём оказалась проблема? Если можно, расскажите поподробнее. У меня, чувствуется, похожая ситуация. Причём отследить мне так и не удалось, на какой операции программа вылетает в exception, т.к. происходит это в разных местах. Поставлю бряк в одном месте, она вылетает в другом. В общем, мистика да и только. Цитата(Master @ May 25 2006, 15:36)  В чём оказалась проблема? Если можно, расскажите поподробнее. У меня, чувствуется, похожая ситуация. Получил подтверждение тому, что что-то лезет на стек: вставил задержку перед выводом в DebugUnit, и стек слетать перестал. Посему очень интересен Ваш способ выхода из данной ситуации.
|
|
|
|
|
May 26 2006, 04:05
|

Странник
   
Группа: Свой
Сообщений: 766
Регистрация: 29-08-05
Из: Екатеринбург
Пользователь №: 8 051

|
Цитата(Master @ May 25 2006, 18:45)  В чём оказалась проблема? Если можно, расскажите поподробнее. У меня, чувствуется, похожая ситуация. Причём отследить мне так и не удалось, на какой операции программа вылетает в exception, т.к. происходит это в разных местах. Поставлю бряк в одном месте, она вылетает в другом. В общем, мистика да и только. Проблема была банальная - "ручное" распределение памяти с небольшим наездом отдельных частей друг на друга, корни проблемы росли из особенностей архитектуры процессора. Все до мелочей уже не помню, в общих чертах: проц с регистровыми банками в памяти, на каком-то вираже добавили обработчик прерывания с индивидуальным банком регистров, некоторое время все работало, потом стали наворачивать, стало падать, но не стабильно... в конце концов выяснилось что при выполнении определенной функции в одной из задач и вызове в это время того самого прерывания (достаточно редкое) портилась пара адресов возврата. Т.к. банк регистров наезжал на стек задачи (или наоборот), а из-за "ручного" распределения памяти не было сообщения об ошибке при линковке, то операции с некоторыми регистрами в прерывании приводили к изменению значений в памяти, куда смотрел и указатель стека задачи. Память была "забита" под завязку, поэтому увеличивать стеки особы было некуда, да и калькулятор подтверждал что уже есть небольшой запас...
--------------------
"Как много есть на свете вещей, которые мне не нужны!" Сократ
|
|
|
|
|
May 26 2006, 04:33
|
Участник

Группа: Свой
Сообщений: 24
Регистрация: 21-10-04
Из: Пермь, РФ
Пользователь №: 934

|
Цитата(Master @ May 25 2006, 15:00)  Цитата(sapID @ May 25 2006, 07:29)  Для поиска таких ошибок удобно использовать Hardware Breakpoint (J-Link/MT-Link). Ставишь брык на запись в область памяти и отладка остановится прямо на команде записи. Затем изучаешь Registers/Disassembler
Ну типа спасибо  Поймите правильно, я некоторое представление об отладке программ имею. В моём случае нужен бряк по изменению содержимого памяти. Подскажите лучше, как RDI по такому условию настроить. Типа, всегда пожалуйста  Про RDI точно не знаю - работаю в режиме J-Link Там в отладке появляется менюшка J-Link -> Watchpoints Дальше все интуитивно понятно, кроме поля Mask - его, обычно, надо ставить 0xFFFFFFFF
|
|
|
|
|
May 26 2006, 06:59
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(spf @ May 26 2006, 10:05)  Проблема была банальная - "ручное" распределение памяти с небольшим наездом отдельных частей друг на друга...  Не я один такой.  Тут недавно тоже у себя обнаружил ошибку в ручном распределение внешней памяти LPC2292 на 4 кольцевых FIFO буфера. Все 4 буфера пересекались и длины не соответствовали. Когда нашёл волосы дыбом встали как я такое понаписать мог (в 3-х макросах запутался)! А ведь как-то год работало.  Видимо потому как данные в буфер попадали на очень небольшое время.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|