(gdb) run -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
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
efence. Вместо этого сценарий оболочки ef организует запуск программы с соответствующей настройкой.Хотя мы не описали механизмы подробно, GNU/Linux (и другие системы Unix) поддерживают
Переменная окружения LD_PRELOAD
ef использует эту особенность для связывания набора функций malloc() в Electric Fence.[179] Таким образом, повторная компоновка даже не нужна. Этот пример демонстрирует ef:$ cc -g ch15-badmem1.c -о ch15-badmem1
$ ef ch15-badmem1 -b
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
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*
-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
core:$ gdb ch15-badmem1 core.28005
GNU gdb 5.3
...