1. Из чего состоит программа?

1.1. Этапы сборки программы

Полную сборку (g++ -o exe main.cpp) можно разбить на этапы:

  1. препроцессинг (g++ -E) → исходный файл для компиляции
  2. компиляция (g++ -c) → объектный файл
  3. создание библиотечного архива (ar -r) → статическая библиотека
  4. линковка (ld или g++) → исполняемый файл или динамическая библиотека

1.2. Изучение объектного файла

Существуют несколько форматов объектных файлов:

Основные секции:

1.3. Список символов

1.4. Изучение секций

1.5. Динамическая и статическая линковки

2. Как работает программа?

2.1. Запуск программы

2.2. Трассировка программы

3. Как отладить программу?

3.1. Система отладки GDB

3.2. Команды GDB

4. Дополнительные системы отладки

4.1. Ещё способы отладки

4.2. Остановка в дебаггере при утечке памяти

Запуск valgrind
$ valgrind --vgdb=yes --vgdb-error=0 prog
==20836== Memcheck, a memory error detector
==20836== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==20836== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==20836== Command: /tmp/e
==20836==
==20836== (action at startup) vgdb me ...
==20836==
==20836== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==20836==   /path/to/gdb /tmp/e
==20836== and then give GDB the following command
==20836==   target remote | vgdb --pid=20836
==20836== --pid is optional if only one valgrind process is running
==20836==
Запуск в другой сессии
$ gdb ./prog
(gdb) target remote | vgdb --pid=20836
Remote debugging using | vgdb
relaying data between gdb and process 2418
Reading symbols from /lib/ld-linux.so.2...done.
Reading symbols from /usr/lib/debug/lib/ld-2.11.2.so.debug...done.
Loaded symbols for /lib/ld-linux.so.2
[Switching to Thread 2418]
0x001f2850 in _start () from /lib/ld-linux.so.2
(gdb) ...
(gdb) monitor exit