MementoMori 4 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба Друзья, вчера меня ввёл в ступор процесс отладки. Очень странная проблема. Есть некая функция ( USBH_class_request, не ручаюсь за точность, это функция из библиотеки USB host для Stm32, камень - н743). Размещаю в ней брейкпоинт, он не срабатывает. Долго думал, что по какой-то причине функция не вызывается, но нет - поставил брейкпоинт раньше, и пошагово шёл от команды к команде и в итоге отладчик в функцию зашёл. Как найти причину? Среда разработки Keil. Отладчик - stlink 2.0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 89 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба Только что, MementoMori сказал: Размещаю в ней брейкпоинт, он не срабатывает. Долго думал, что по какой-то причине функция не вызывается, но нет - поставил брейкпоинт раньше, и пошагово шёл от команды к команде и в итоге отладчик в функцию зашёл. Оптимизация включена? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба 1 минуту назад, MementoMori сказал: Как найти причину? Выключить оптимизацию, пересобрать проект полностью заново с отладочной информацией. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба Включена, уровень 3. Спасибо, вечером попробую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AleksBak 0 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба 3 часа назад, MementoMori сказал: Включена, уровень 3. Там (в STM32CubeIDE и gcc) еще есть уровень оптимизаии - 'Debug'. Его лучше тогда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба 15 minutes ago, AleksBak said: Там (в STM32CubeIDE и gcc) еще есть уровень оптимизаии - 'Debug'. Его лучше тогда. У меня кейл 5.х Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 16 сентября, 2020 Опубликовано 16 сентября, 2020 · Жалоба 10 часов назад, MementoMori сказал: поставил брейкпоинт раньше, и пошагово шёл от команды к команде и в итоге отладчик в функцию зашёл. Может пока вы неспешно выполняли команду за командой успело произойти какое-то событие, без которого программа в функцию заходить не должна? Или, как тут правильно намекнули, вы ставите точку останова на выражение, которое компилятор соптимизировал настолько, что уже не в состоянии найти соответствующую его началу ассемблерную инструкцию (на адрес которой он должен поставить точку останова). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба Спасибо, помогло. Следующая проблемка. /*---------- -----------*/ #define USBH_DEBUG_LEVEL 0U #if (USBH_DEBUG_LEVEL > 0U) #define USBH_UsrLog(...) do { \ printf(__VA_ARGS__); \ printf("\n"); \ } while (0) #else #define USBH_UsrLog(...) do {} while (0) #endif Так выводятся отладочные сообщения. Для этого нужно включить DEBUG_LEVEL, присвоить ему значение больше нуля. Как только я это делаю, после старта проц несколько раз останавливается при старте. Еще до обращения к библиотеке USB То есть, можно поставить брейкпоинт здесь и до его срабатывания не доходит. Только после трех нажатий "Run". А дальше все как обычно, работа без проблем. Во время остановки в ассемблерном окне вот что Причем, если где-нибудь до инициализации USB поставить while(1) и компилятор поймет, что до USB дело не дойдет, проблема исчезает. То есть строки #define USBH_UsrLog(...) do { \ printf(__VA_ARGS__); \ printf("\n"); \ } while (0) создают проблему не своим действием, но своим присутствием. Проблема эта отсутствует на F746 камне на плате Discovery, в проекте сгенерированном кубом. Проблема эта присутствует на H743 камне на самопальной плате, в проекте сгенерированном кубом. Исходя из этого, полагаю, куб ни при чем, плата, думаю тоже, значит какая-то особенность 743 камня, не учтенная в библиотеке USB Что делать и кто виноват? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 1 час назад, MementoMori сказал: Что делать и кто виноват? В вашей программе присутствует команда останова. Кто виноват, что в ней появилась такая команда? Что делать: искать в .map, внутри находится этот адрес, искать эту функцию в исходнике, удалить из нее эту команду или пытаться понять - зачем ее туда поместили и как ее обойти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба То есть, искать функцию, адрес которой ближе всего к 08000Е8С и при этом меньше его? Пардон, а какая такая команда на С приводит к остановке? Ассемблерных вставок, где могла бы быть такая команда, я вроде бы не видел... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 10 minutes ago, MementoMori said: Пардон, а какая такая команда на С приводит к остановке? Никакая) Ищете по всему тексту в проекте "bkpt" без чувствительности к регистру... 11 minutes ago, MementoMori said: Ассемблерных вставок Они оформляются разными способомами, может быть просто не заметили) А файлы на ассемблере есть? Возможно, в них находится эта команда. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 4 minutes ago, haker_fox said: Никакая) Ищете по всему тексту в проекте "bkpt" без чувствительности к регистру... Иными словами, если описанный казус у меня происходит, то это однозначно дело рук асмемблерного кода? А компилятор не может глюкануть и при переваривания С кода родить такую команду? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 243 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 59 минут назад, Сергей Борщ сказал: В вашей программе присутствует команда останова. Кто виноват, что в ней появилась такая команда? Для того, чтобы BKPT появилось в образе программы во флешь, не обязательно команда останова должна присутствовавть в программе. Такое иногда случается, если во время отладки был установлен программный бряк во флешь (не аппаратный), а потом отладочная сессия была неожиданно некорректно разорвана. Например - отключением питания МК, нарушением связи с отладчиком и т.п.. Тогда отладчик не успеет снять этот бряк и он останется в коде. 15 минут назад, MementoMori сказал: Иными словами, если описанный казус у меня происходит, то это однозначно дело рук асмемблерного кода? Не обязательно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 11 minutes ago, MementoMori said: то это однозначно дело рук асмемблерного кода? Я других способов не знаю, но вам про них написал уважаемый @jcxz) Есть ещё так называемые intrinsic-функции, но среди них не нашёл __BKPT() 8 minutes ago, jcxz said: успеет снять этот бряк и он останется в коде. О как! Даже не предполагал такого, вернее на сталкивался. Спасибо за информацию! В этом случае автору топика остаётся лишь перепрошить МК) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MementoMori 4 17 сентября, 2020 Опубликовано 17 сентября, 2020 · Жалоба 9 minutes ago, jcxz said: Такое иногда случается, если во время отладки был установлен программный бряк во флешь (не аппаратный), а потом отладочная сессия была неожиданно некорректно разорвана. Например - отключением питания МК, нарушением связи с отладчиком и т.п.. Тогда отладчик не успеет снять этот бряк и он останется в коде. Вот кстати, обратил внимание на странный факт - после того, как я выключаю отладку, кейл фокусирует рабочее окно на файле .S и в тексте имеющегося там кода напротив некоторых строк стоят брейкпоинт, хотя я их туда не ставил. Я убираю, но спустя какое то время они появляются вновь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться