В ГБД info registers
или же info all-registers
покажет вам все имена символов регистра и их значения.
Вопрос:
Как я могу получить переменная имя (то есть из исходного кода), которое хранится в этом регистре? (или номер строки в исходном коде, или что-нибудь)
Например:
int my_reg = /* something */;
float another_reg = /* something else */;
...
Тогда, возможно, info all-registers
вернусь:
R0 0x0 0
R1 0xfffbf0 16776176
R2 0x0 0
R3 0x0 0
R4 0x6 6
Как определить, какой регистр (R0? R2? R4?) «Связан» с my_reg
?
Там может быть один регистр, несколько регистров или даже нет регистров, связанных с любой данной переменной C в любой данный момент времени. Вам нужно будет проверить разборку, чтобы увидеть, что происходит.
Почему не просто print my_reg
чтобы увидеть ценность?
l *$pc
перечислит исходный код вокруг текущей выполняемой инструкции.
Если у вас есть доступ к символам отладки (и вы понимаете, как их читать, то есть у вас есть код, который анализирует символы отладки), можно точно отследить, какой регистр соответствует какому регистру. Тем не менее, это вполне возможно, меняется с одной строки на другую, так как компилятор решает переместить вещи по той или иной причине (например, некоторые вычисления начинаются с R1 и заканчиваются результатом в R2, потому что это лучше, чем пытаться сохранить значение в R1 [или нам нужно исходное значение в R1 — подумайте array[x++]
— теперь у нас есть новое значение x
Надеюсь, в реестре, и значение старого x
что нам нужно использовать для индексации, также необходимо внести в регистр, чтобы добавить к базовому адресу array
,
Не все переменные попадают в регистры (в зависимости от процессора и «какие регистры доступны»).
Отладчик БУДУТ знать, где каждая переменная находится в любой момент времени — но иногда это может быть очень запутанным, например:
int array[10000];
...
for(int i = 0; i < 10000; i++)
{
array[i] = rand();
}
может перевести что-то подобное во время оптимизации:
int array[10000];
int *ptr = array;
int *ptr2 = &array[10000];
while(ptr < ptr2)
{
*ptr++ = rand();
}
Теперь попробуйте распечатать i
…;)