2013-06-20 6 views
3

В GDB info registers или info all-registers покажут вам все имена имен регистров и их значения.gdb - получить переменное имя регистра

Вопрос:

Как получить переменную имя (т.е. из исходного кода), который хранится в этом регистре? (Или номер строки в исходном коде, или что-нибудь)

Например:

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?

ответ

2

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

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

будет перечислять исходный код вокруг текущей выполняемой инструкции.

+0

Даже если есть несколько регистров, связанных с переменной, я все еще хочу знать, глядя на регистр. – cmo

+1

Я не уверен, что это операция, которая имеет смысл. Разве вы не можете просто посмотреть на разборку и посмотреть? –

+0

Я действительно прихожу с другой точки зрения. Учитывая список регистров, как их сопоставить с переменными? Это противоположно определению значения данной переменной. – cmo

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 ...;)

+0

Итак ... как мне разобрать эти символы отладки? Есть ли какой-то популярный пакет для этого? – cmo

+0

С трудом ... Отладочные символы - это сложное описание того, что происходит во время компиляции. Различные архитектуры процессоров (по умолчанию) разные форматы отладки - для чего это процессор? –

+0

Мотивация - это, на самом деле, GPU. Я пытаюсь понять использование регистра, потому что использование слишком большого количества регистров для каждой строки отрицательно сказывается на производительности графического процессора. CUDA завербовал GDB для создания «cuda-gdb». Это то же самое, что и GDB плюс несколько функций. Но эта проблема с именованием регистров одинакова для обоих (gdb и cuda-gdb). – cmo