Отладка LauterBach в trace32: есть ли способ установить точку останова данных для локальной переменной перед входом в контекст?
Из справочного документа, чтобы установить точку останова доступа к данным, мы можем использовать
var.break <variable> /READWRITE
Однако это может работать только тогда, когда мы ввели контекст для этой переменной.
Поскольку я хочу написать скрипт PRACTICE для автоматической отладки, я хочу сделать это до запуска программ. Что-то вроде
....
var.break <foo>::<variable> /READWRITE
GO
WAIT !run()
...
Есть ли способ сделать это?
2 ответа
В общем случае вы можете устанавливать точки останова только для локальных переменных (до входа в функцию объявления), если локальные переменные были объявлены статическими. (Это не является ограничением TRACE32. Ни один отладчик не может установить точку останова для нестатической переменной перед входом в функцию объявления).
Предположим, у вас есть такая функция:
int myFunc(int x) {
int myVar;
static int myStaticVar;
/* ... */
}
Для статической локальной переменной вы можете установить точку останова с помощью
`Var.Break.Set myFunc\myStaticVar /ReadWrite`
Точки останова чтения / записи работают с использованием компараторов адресов, расположенных на целевом процессоре. Таким образом, такие точки останова работают только со статическими адресами. Однако нестатические локальные переменные не имеют фиксированного адреса. Они расположены в основных регистрах или относительно указателя кадра функции в стеке вызовов.
Проверьте местоположение вашей локальной переменной с помощью команды Var.INFO myFunc\myVar
Для локальной (нестатической) переменной, расположенной в стеке вызовов, вы можете установить точку останова чтения / записи перед входом в функцию с помощью следующего трюка:
Var.NEWGLOBAL void * \temp
Break.Set myFunc /Program /CMD "Var.Break.Set myVar /ReadWrite" /CMD "Var.Set \temp=&myVar" /RESUME
Break.Set sYmbol.EXIT(myFunc) /Program /CMD "Break.Delete Var.VALUE(\temp)++(Var.SIZEOF(myVar)-1)" /RESUME
Это установит точку останова, которая останавливает ваш процессор при входе в вашу функцию. Когда процессор останавливается на этой точке останова, отладчик устанавливает переменную для точки останова чтения / записи. Третья команда гарантирует, что точка останова чтения / записи удаляется при выходе из функции. (В противном случае точка останова чтения / записи может сработать для совершенно другой переменной в совершенно другой функции)
Для локальной (нестатической) переменной, расположенной в регистре ядра, вы обычно не можете установить точку останова чтения / записи. Однако некоторые процессоры поддерживают точки останова в регистре ядра. В этом случае вы можете установить точку останова следующим образом:
Var.Break.Set myFunc /VarReadWrite myFunc\myVar
или же
Var.Break.Set myFunc /RegisterReadWrite R1
Во втором случае предположим, что вы знаете, что ваша переменная находится в регистре ядра R1.
Прежде всего, мы не можем установить точки останова для локальной переменной. Причина в том, что локальные переменные имеют переменные автоматического типа, то есть эти переменные распределяются в памяти только на короткий промежуток времени между вызовом функции и до ее выхода. Нет памяти, выделенной для локальных переменных вне области функции. Следовательно, точки останова не могут быть установлены для локальных переменных.
Для решения этой проблемы вы можете либо объявить глобальную переменную вместо локальной, либо объявить статическую локальную переменную. В случае статической локальной переменной выделенная память зарезервирована вне области функции, в которой она определена. Делая так, вы можете автоматизировать свой тест, но локальные переменные не могут помочь.