2014-11-12 3 views
2

Итак, я делаю кучу стека/кучи с помощью gdb и пытаюсь захватить значение для someInt, но бросил мои ограниченные знания gdb, чтобы получить его без эффекта. Мне нужно получить значение someInt с помощью GDB, и это только ссылки в одном месте за пределами #define, строка 20Как напечатать #define значение в gdb?

#define someInt 0x11111111 

void someFunc() { 
    // ... 
    int a = 0; 
    if(a==someInt) { //line 20 
    //... 
    } 
} 

После вызова GDB на скомпилированной программе я попытался gdb break 20, а затем gdb x\dw $someInt я получаю Нет символа «someInt» в текущем контексте. Если я попробую x/dw 0x11111111, я получаю «Невозможно получить доступ к памяти по адресу 0x11111111». Я не могу перекомпилировать код a la How do I print a #defined constant in GDB? и, таким образом, потерял информацию о том, как печатать значение в этом пространстве.

Как использовать gdb (скорее всего, с x) для печати значения someInt?

+0

'захватить значение для someInt' .... концептуальная проблема. Что такое 'someInt' ?? –

+0

someInt - это значение, которое, если «a» соответствует ему, дает мне (через оператор if) ложный доступ к оболочке, чтобы продемонстрировать концепцию в книге –

+0

Итак, вы можете увидеть определение, но вы все равно хотели бы знать значение макроса ? Или вам нужно распечатать значение a? – dbrank0

ответ

1

Ответ здесь: GCC -g vs -g3 GDB Flag: What is the Difference?

Compile с -O0 -ggdb3:

gcc -O0 -ggdb3 source.c 

From doc

-ggdb уровень - запрос информации об отладке, а также использовать уровень указать количество информации. Уровень по умолчанию равен 2.

Уровень 3 включает дополнительную информацию, такую ​​как все макроопределения, присутствующие в программе. Некоторые отладчики поддерживают расширение макросов при использовании -g3.

9    if(a == someInt) 
(gdb) list 
4 
5  int main() 
6  { 
7    int a=0; 
8 
9    if(a == someInt) 
10    { 
11      printf("!\n"); 
12    } 
13  } 
(gdb) p someInt 
$1 = 1111 
0

Да. MACROS обычно экспансируются и просто используются как text replacement. Вот почему gdb сообщает, что в вашем коде нет someInt.

effecttively, после предварительной обработки, ваш код выглядит

void someFunc() { 
    // ... 
    int a = 0; 
    if(a==0x11111111) { //line 20 //note the change 
    //... 
    } 
} 

так, в бинарном файле, нет Существования в someInt.

Подсказка: не путать someInt как переменную. Надеюсь это поможет.

+0

Уточнил вопрос; Я ищу, как распечатать значение на #define-адресе с помощью gdb (и в сочетании с x), не изменяя код –

+0

@KurtWagner и как вы точно знаете 'значение в #define address'? Что вы до этого? –

+0

Я следую в книге по эксплуатации, чтобы лучше понять, как люди делают такие вещи, как переполнение стека/кучи и получение доступа к оболочке. Это одна из проблем, поэтому это должно быть осуществимо, я просто не получаю концепцию gdb, критическую для этого бита .... –

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