gdb — получить имя переменной регистра

В ГБД 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?

4

Решение

Там может быть один регистр, несколько регистров или даже нет регистров, связанных с любой данной переменной C в любой данный момент времени. Вам нужно будет проверить разборку, чтобы увидеть, что происходит.

Почему не просто print my_reg чтобы увидеть ценность?

l *$pc перечислит исходный код вокруг текущей выполняемой инструкции.

2

Другие решения

Если у вас есть доступ к символам отладки (и вы понимаете, как их читать, то есть у вас есть код, который анализирует символы отладки), можно точно отследить, какой регистр соответствует какому регистру. Тем не менее, это вполне возможно, меняется с одной строки на другую, так как компилятор решает переместить вещи по той или иной причине (например, некоторые вычисления начинаются с 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…;)

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector