П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 175061 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 72059 раз(а).

Учебник HTML.
Просмотров 72113 раз(а).

Руководство по PHP5.
Просмотров 42732 раз(а).

Хостинг через призму DNS.
Просмотров 49227 раз(а).

Подборка текстов стандартных документов.
Просмотров 43151 раз(а).

Учебник PHP - Самоучитель
Просмотров 49491 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 49756 раз(а).

Внешние атаки...
Просмотров 40284 раз(а).

Учебник PHP.
Просмотров 35315 раз(а).

SSI в примерах.
Просмотров 26585 раз(а).






 
 
| Добавить в избранное | Сделать стартовой Project.Net.Ru | Помощь




Подробный пример

Следующий пример показывает размещение переменных в памяти:

/* 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 &nothing
$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, чтобы увидеть их все).

Назад | Содержание | Вперед



Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru