2017-02-14 2 views
2

Попытка установить точку останова в определенном месте и задать условие триггера, основанное на значении одного из регистров, например. R1 (процессор семейства Cortex-R).Использование регистров в условиях прерывания с помощью Trace32

Есть ли способ сделать это в trace32? Каков синтаксис условия?

+0

Прошу прояснить, что подразумевается под условием «триггер», вы имеете в виду, что «эта точка останова должна прекратить выполнение, только если R1 == определенное значение?» Если это так, единственный способ, по которому я вижу, что вы можете это сделать, - установить точку останова, которая запускает скрипт Practice, и этот скрипт практики может проверять условия запуска и, таким образом, возобновлять выполнение на процессоре (не указывая " go ") или остановить выполнение скрипта и освободить управление для пользователя. Обратите внимание, что это будет иметь определенное влияние на время выполнения кода. – juansolsona

+0

Я имею в виду обычную точку останова программы с условием. Это просто с условиями, которые включают статические или неоптимизированные переменные стека. Не кажется очевидным, почему регистры в состоянии должны быть разными - так что, может быть, я просто не вижу правильного синтаксиса для обращения к регистру? T32 использует «register.xxx» для манипулирования ими. Не видел никакой конструкции с регистром, который можно поместить в окно «смотреть», хотя –

ответ

3

Вы также можете проверить значения регистра в состоянии точки останова.

Однако имейте в виду, что условные точки останова всегда навязывают поведение вашего чипа во время выполнения. Это означает, что ваш целевой процессор всегда останавливается в месте точки останова, тогда отладчики оценивают это состояние и затем перезапускают CPU, если условие не было выполнено. (Обратите внимание, что «условные точки останова» - это не то же самое, что «точки останова данных» (определенное значение записывается в определенное место). Точки останова данных не являются навязчивыми для многих фишек (например, Cortex-R)).

Основной трюк заключается в использовании функции PRACTICE Register() для доступа к регистру.

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

  • Break.Set <prog.addr|symbol> /Program /CONDition Register(<reg.>)==<reg.value>
  • Break.Set <prog.addr|symbol> /Program /VarCONDition \Register(<reg.>)==<value>

Например:

  • Break.Set P:0x1000 /Program /CONDition Register(R0)==0x42
  • Break.Set P:0x1000 /Program /VarCONDition \Register(R0)==0x42

Разница между этими двумя командами? Первый использует выражения TRACE32, где символы обозначают их адрес (например, компоновщик видит символы). Второй использует так называемые выражения HLL, где символы обозначают переменные, как на языке C/C++. (HLL expr. == C-style expr.)

Обычно легче писать условия в выражениях HLL (особенно когда они имеют дело с переменными), в то время как использование функций PRACTICE обычно проще в выражениях TRACE32.

Вы также можете установить условие в диалоговом окне Break.Set: нажмите кнопку «advanced», а затем ваше условие в поле «CONDition». Флажок HLL справа от поля «CONDition» определяет, если вы используете выражение HLL или нет.

Смежные вопросы