Подробный пример
Следующий пример показывает размещение переменных в памяти:
/* mem.c */
int index = 1; //в data
char * str; //в bss
int nothing; //в bss
void f(char c)
{
int i; //в стеке
/* Резервирует 5 символов в куче */
str = (char*) malloc (5 * sizeof (char));
strncpy(str, "abcde", 5);
}
int main (void)
{
f(0);
}
Отладчик gdb подтверждает все это.
>>gdb mem
GNU gdb 19991004
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public
License, and you are welcome to change it and/or distribute
copies of it under certain conditions. Type "show copying"
to see the conditions. There is absolutely no warranty
for GDB. Type "show warranty" for details. This GDB was
configured as "i386-redhat-linux"...
(gdb)
Установим точку останова в функции f() и выполним программу до этого момента:
(gdb) list
7 void f(char c)
8 {
9 int i;
10 str = (char*) malloc (5 * sizeof (char));
11 strncpy (str, "abcde", 5);
12 }
13
14 int main (void)
(gdb) break 12
Breakpoint 1 at 0x804842a: file mem.c, line 12.
(gdb) run
Starting program: mem
Breakpoint 1, f (c=0 '\000') at mem.c:12
12 }
Теперь мы можем увидеть размещение различных переменных.
1. (gdb) print &index
$1 = (int *) 0x80494a4
2. (gdb) info symbol 0x80494a4
index in section .data
3. (gdb) print ¬hing
$2 = (int *) 0x8049598
4. (gdb) info symbol 0x8049598
nothing in section .bss
5. (gdb) print str
$3 = 0x80495a8 "abcde"
6. (gdb) info symbol 0x80495a8
No symbol matches 0x80495a8.
7. (gdb) print &str
$4 = (char **) 0x804959c
8. (gdb) info symbol 0x804959c
str in section .bss
9. (gdb) x 0x804959c
0x804959c <str>: 0x080495a8
10. (gdb) x/2x 0x080495a8
0x80495a8: 0x64636261 0x00000065
Команда под номером 1 (print &index ) показывает адрес в памяти глобальной переменной index . Вторая инструкция (info ) выдает символ, ассоциированный с этим адресом и место в памяти, где он может быть найден: index - инициализированная глобальная статическая переменная хранится в области data .
Инструкции 3 и 4 подтверждают, что неинициализированная статическая переменная nothing находится в сегменте BSS .
Строка 5 выводит str ... фактически, содержимое переменной str , т.е. адрес 0x80495a8 . Инструкция 6 показывает, что никакая переменная не определена по этому адресу. Команда 7 позволяет узнать адрес переменной str и команда 8 показывает, что она находится в сегменте BSS .
В 9 отображается 4 байта содержащиеся по адресу 0x804959c : это зарезервированный адрес в куче. Содержимое в 10 показывает нашу строку "abcde":
шеснадцатиричное значение : 0x64 63 62 61 0x00000065
символ : d c b a e
Локальные переменные c и i помещены в стек.
Заметим, что размеры различных областей, возвращаемые командой size , не совпадают с тем, что мы ожидаем увидеть, просматривая программу. Причина в том, что при выполнении программы, появляются различные переменные, определеные в библиотеках (наберите info variables в gdb , чтобы увидеть их все).
Назад |
Содержание |
Вперед
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|