(gdb) run -b /* Попробовать опцию -b */
Starting program: /home/arnold/progex/code/ch15/ch15-badmem1 -b
[New Thread 8192 (LWP 28021)]
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens
p =
Program received signal SIGSBGV, Segmentation fault.
SIGSBGV: GDB prints where
[Switching to Thread 8192 (LWP 28021)]
0x080485b6 in main (argc=2, argv=0xbffff8a4) at ch15-badmem1.c:18
18 p[42] = 'a'; /* коснуться за пределами границы */
(gdb) run -f /* Теперь попробовать опцию -f */
The program being debugged has been started already.
Start it from the beginning? (y or n) y /* Да */
Starting program: /home/arnold/progex/code/ch15/ch15-badmem1 -f
[New Thread 8192 (LWP 28024)]
Electric Fence 2.2.0 Copyright (C) 1987-1999 Bruce Perens
p =
Program received signal SIGSEGV, Segmentation fault. /* Снова SIGSEGV */
[Switching to Thread 8192 (LWP 28024)]
0x080485e8 in main (argc=2, argv=0xbffff8a4) at ch15-badmem1.c:21
21 p[0] = 'b';
На системах, которые поддерживают разделяемые библиотеки и переменную окружения LD_PRELOAD
(в том числе и на GNU/Linux), вам не нужно явным образом компоновать библиотеку efence
. Вместо этого сценарий оболочки ef
организует запуск программы с соответствующей настройкой.
Хотя мы не описали механизмы подробно, GNU/Linux (и другие системы Unix) поддерживают
Переменная окружения LD_PRELOAD
заставляет системный загрузчик программ (который загружает исполняемые файлы в память) связаться со специальной библиотекой до стандартных библиотек. Сценарий ef
использует эту особенность для связывания набора функций malloc()
в Electric Fence.[179] Таким образом, повторная компоновка даже не нужна. Этот пример демонстрирует ef
:
$ cc -g ch15-badmem1.c -о ch15-badmem1 /* Компилировать как обычно */
$ ef ch15-badmem1 -b /* Запустить с использованием ef, создает дамп ядра */
Electric Fence 2.2.0 Copyright (С) 1987-1999 Bruce Perens
p =
/usr/bin/ef: line 20: 28005 Segmentation fault (core dumped)
( export LD_PRELOAD=libefence.so.0.0; exec $* )
$ ef ch15-badmem1 -f /* Запустить с использованием ef, снова создает дамп ядра */
Electric Fence 2.2.0 Copyright (С) 1987-1999 Bruce Perens
p =
/usr/bin/ef: line 20: 28007 Segmentation fault (core dumped)
( export LD_PRELOAD=libefence.so.0.0; exec $* )
$ ls -l core* /* Linux создает для нас разные файлы core */
-rw------- 1 arnold devel 217088 Aug 28 15:40 core.28005
-rw------- 1 arnold devel 212992 Aug 28 15:40 core.28007
GNU/Linux создает файлы core
, которые включают в свое имя ID процесса. В данном случае такое поведение полезно, поскольку мы можем отдельно отлаживать каждый файл core
:
$ gdb ch15-badmem1 core.28005 /* От опции -b */
GNU gdb 5.3
...