Как автоматически отключить/удалить точку останова в IAR после ее попадания?

Можно ли установить точку останова во встроенной рабочей среде IAR для ARM IDE таким образом, чтобы после ее достижения она автоматически удалялась/деактивировалась?

Я уже знаю способ сделать это, используя макросы C-SPY и функции __setCodeBreak(), а затем __clearBreak(). Проблема в том, что мне нужно установить желаемую точку останова, используя другую точку останова и макрос C-SPY, в котором __setCodeBreak() устанавливает нужную точку останова, после чего я могу использовать для нее макрос C-SPY, в конце которого __clearBreak() удаляет точку останова. Однако я хочу иметь возможность установить точку останова непосредственно в IAR IDE и связать ее с макросом C-SPY, а затем точка останова будет удалена/отключена при попадании (я не могу заставить __clearBreak() работать вторым способом, автономным )

Вот пример того, что я объяснил выше:

__var bp2;

// This macro sets a new breakpoint (bp2), and is linked to another breakpoint (let's say bp1 which is set in the IDE)
Set_bp2()  
{
bp2 = __setCodeBreak("{C:\\file.c}.80.1", 0, "ActionMacro()", "TRUE", "");
}

//This macro gets executed when the new breakpoint (bp2) is hit and then removes this breakpoint (bp2)
ActionMacro()  
{
__message "bp2 is hit ...";
__clearBreak(bp2);
}

Итак, __clearBreak() удается очистить точку останова, используя код возврата __setCodeBreak(), однако я хотел бы иметь макрос, который независимо от другого макроса может очищать точку останова, на которую ссылается, что-то вроде ниже:

ActionAndClear()  // This macro is linked to a breakpoint which is set in the IDE
{
__message "breakpointX is hit ...";
__clearBreak(<UNKNOWN>);
}

Есть ли значение для UNKNOWN, которое помогает?


person Kepler    schedule 26.01.2021    source источник
comment
Возможно, это проблема X-Y. Возможно, вам следует опубликовать код файла макроса и исправить его, а не запрашивать решение с нуля.   -  person Clifford    schedule 26.01.2021
comment
На самом деле это не проблема X-Y и не решение с нуля, вы знакомы с макросами C-SPY? Я бы предпочел сослаться на документ «Руководство по отладке», предоставленный IAR, но проблема в том, что я не уверен, нормально это или нет (с точки зрения авторского права/лицензии). Однако я мог бы даже привести пример самого себя, тогда Я бы объяснил, что работает, что отличается от того, что я хочу. (Я не буду вдаваться в это прямо сейчас без примера, возможно, это не так просто, но, если коротко, __setCodeBreak() возвращает идентификатор, а затем __clearBreak() использует этот идентификатор для удаления точки останова).   -  person Kepler    schedule 27.01.2021
comment
Я бы ожидал для этого не более одной строки, однако я начинаю думать, что это вообще невозможно, учитывая, как эти функции используются в документе «Руководство по отладке», поэтому я мог бы удалить вопрос или сам дать ответ, что это невозможно и приведите пример, который делает работу по-другому, используя упомянутые функции. Вы знаете, могу ли я ссылаться на этот документ или нет? документ не может быть найден на их веб-сайте.   -  person Kepler    schedule 27.01.2021
comment
Я набросал ответ, но при повторном прочтении ваших требований показалось, что они не относятся к ним так, как вы хотите, и могут быть дубликатом того, что у вас уже есть (поэтому было бы неплохо опубликовать это) . Я удалю его, чтобы вы могли его увидеть, но не удивляйтесь, если это не то, что вам нужно (или проголосуйте за него - я знаю о его возможных недостатках, но вы можете прокомментировать его, есть ли что-нибудь там полезно).   -  person Clifford    schedule 27.01.2021
comment
Я думаю, что применяются правила добросовестного использования. Я сомневаюсь, что IAR будет возражать против бесплатной рекламы, и в любом случае руководства доступны на их сайте. Атрибуция — хорошая идея. Как вы можете видеть из моего ответа, я использовал изображение с их сайта - никто еще не подал на меня в суд; но я не юрист.   -  person Clifford    schedule 27.01.2021
comment
это правильно, к сожалению, это не касается моего вопроса, я привел пример, теперь он должен быть более ясным.   -  person Kepler    schedule 27.01.2021


Ответы (1)


Число, если решения возможны:

Грубое решение состоит в том, чтобы использовать точку останова условия и вспомогательную переменную:

bool break_here = true ;

...
break_here = false ; // Place condition break on this line

Если вы установите прерывание условия, когда break_here == true, оно сломается в первый раз, установите флаг в false и больше никогда не сломается. Однако разрывы условий требуют времени, чтобы остановиться и оценить условие, поэтому это может быть неподходящим.

Также грубо, но без проблем с производительностью, сделайте точку останова условной непосредственно в коде:

static bool break_here = true ;
if( break_here )
{
    __breakpoint(0) ;
    break_here = false ;
}

Вышеуказанные методы будут работать с любыми отладчиками. C-Spy позволяет вам вызывать макросы при определенных условиях, таких как запуск отладчика, сброс процессора или точки останова. Имейте в виду, что я не использую IAR EWB или C-Spy, описанное здесь макрос-решение может нуждаться в некоторой настройке, я работаю на основе документации. Не стесняйтесь исправлять это, если вы обнаружите какие-либо ошибки, но главное — так или иначе использовать макрос C-Spy.

Итак, у вас может быть файл макроса:

__var break_count ;
__var break_handle ;

execUserReset()
{
    break_count = 1 ;
    break_handle = __setCodeBreak( "{myfile.c}.82.1", 0, "onBreakOnce()", "TRUE", "" ) ;
}

onBreakOnce()
{
    break_count-- ;
    if( break_count == 0 )
    {
        __clearBreak( break_handle ) ;
    }
}

Это будет устанавливать точку останова при каждом сбросе и удалять точку останова при первом обнаружении.

Измените break_count, если вы хотите сделать перерыв еще раз перед удалением. Это имеет эффект, противоположный аргументу skip-count. В вызове __setCodeBreak() можно установить количество пропусков, чтобы вы могли пропустить несколько проходов, затем сделать перерыв на несколько проходов, затем удалить точку останова... если вы действительно этого хотите!

Вы настраиваете файл макроса в EWB следующим образом:

введите здесь описание изображения

Атрибуция изображения https://www.iar.com/support/resources/articles/introduction-to-debugging-with-c-spy-macros/

person Clifford    schedule 26.01.2021
comment
Спасибо за ваше время, это почти так же, как я упомянул в вопросе (я привел пример), проблема в том, что он зависит от другого макроса, поэтому он увеличивает количество необходимых точек останова, во-вторых, номер строки должно быть жестко закодировано в этом. - person Kepler; 27.01.2021
comment
@Kepler действительно - вот почему я изначально удалил его, это явно не решило вашу проблему. Что ему действительно нужно, так это 1) макроязык для поддержки семантики переменных static и 2) средство назначения определяемого пользователем имени или дескриптора точки останова, на которую вы могли бы ссылаться в __clearBreak(). Без этого у первого метода есть некоторые достоинства - означает размещение кода в точке, которую вы хотите сломать, но она небольшая, и если вы не установите точку останова, это не повлияет на код. Обратите внимание, что метод инструкции BKPT лучше всего защищен тестом, чтобы увидеть, подключен ли отладчик. - person Clifford; 27.01.2021