Налагодження за допомогою GDB. Вивчаємо З використанням GDB Знищення дочірнього процесу

GDBвідноситься до «розумних» програм-відладчиків, тобто таких, які «розуміють» код і вміють виконувати його рядково, змінювати значення змінних, встановлювати контрольні точки та умови зупинки… Словом, робити все для того, щоб розробник міг перевірити правильність роботи своєї програми .

GDBвбудований у багато UNIX-подібні системи і вміє проводити налагодження кількох мов програмування. Сі - серед них.

Щоб визвати GDBвведіть у терміналі команду

Gdb [ ім'я_програми_яку_ви_бажаєте_налагодити]

Щоб вийти з GDB: введіть команду

Quit або C –d

Інші важливі команди GDB

run [аргументи командного рядка програми] Запустити програму виконання. break [ номер рядка / ім'я функції] Встановити точку зупинки програми на певному рядку чи функції. next Перейти до наступного рядка, не заходячи всередину функцій. step Перейти до наступного рядка. Якщо на рядку виклик функції - зайти до неї. list Вивести фрагмент коду програми (кілька рядків навколо місця, де зараз встановлена ​​точка) print [ змінна] Вивести значення змінної на екран. info locals Вивести поточні значення всіх локальних змінних всередині циклу, функції тощо. display [ змінна] Вивести значення змінної на кожному кроці налагодження. help Показати список усіх команд GDB.

Давайте подивимося, як працювати з GDB на прикладі caesar.c, яку ви, швидше за все, вже написали минулого тижня. Перевіряти будемо на власній версії, тому у вас результати можуть дещо відрізнятися в залежності від реалізації.

Отже, переходимо до папки pset2 (думаємо, ви вже пам'ятаєте, як це зробити) у «Віртуальній лабораторії CS50» або CS50 IDE. Вводимо команду:

Gdb. /caesar

У програмі caesar є одна функція, main. Встановимо точку зупинки програми на функції main:

break main

Запустимо програму caesar з аргументом "3":

Run 13

Допустимо, нам треба перевірити значення argc:

Print argc

Ось як все це має виглядати у вікні терміналу:

Тепер виконуємо програму покроково за допомогою команди next. Виконаємо кілька разів.

Тут змінної key надають значення. Перевіримо, яке значення вона має в цьому рядку:

При першому виклику next змінної key надається значення «0». Чому так, якщо ми запровадили число 3? Справа в тому, що команда ще не була виконана. Коли ви вводимо ще кілька разів next, програма пропонує ввести текст.

Виконавши команду Next ще раз, ми зайдемо всередину циклу з умовою.

Мета налагодження програми - усунення помилок у її коді. Для цього вам, швидше за все, доведеться дослідити стан змінних у час виконання, Так само як і сам процес виконання (наприклад, відстежувати умовні переходи). Тут відладчик – наш перший помічник. Звичайно ж, у Сі досить багато можливостей налагодження без безпосередньої зупинки програми: від простогоprintf(3) до спеціальних систем ведення логів по мережі та syslog. В асемблері такі методи теж застосовні, але вам може знадобитися спостереження за станом регістрів, образ (dump) оперативної пам'яті та інші речі, які набагато зручніше зробити в інтерактивному відладчику. Загалом, якщо ви пишете на асемблері, то без відладчика ви навряд чи обійдетеся.

Почати налагодження можна з визначення точки зупинки ( breakpoint ), якщо вже приблизно знаєте, яку ділянку коду необхідно досліджувати. Цей спосіб використовується найчастіше: ставимо точку зупинки, запуск програму і проходимо її виконання по кроках, попутно спостерігаючи за необхідними змінними і регістрів. Ви також можете просто запустити програму під налагоджувачем і зловити момент, коли вона аварійно завершується через segmentation fault, - так можна дізнатися, яка інструкція намагається отримати доступ до пам'яті, докладніше розглянути змінну змінну і так далі. Тепер можна дослідити цей код ще раз, пройти його по кроках, поставивши точку зупинки трохи раніше моменту збою.

Почнемо із простого. Візьмемо програму Hello world і скомпілюємо її з налагоджувальною інформацією за допомогою ключа компілятора -g:

$ gcc -g hello.s -o hello $

Запускаємо gdb:

$ gdb ./hello GNU gdb 6.4.90-debian Copyright (C) 2006 Free Software Foundation, Inc. GDB є free software, що поширюється на GNU General Public License, і ви маєте намір змінити його і/або розмістити копії його під певними умовами. Type "show copying" to see the conditions. Це є абсолютно не warranty for GDB. Type "show warranty" for details. Цей GDB був configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb)

GDB запустився, завантажив досліджувану програму, вивів на екран запрошення (gdb) і чекає на команди. Ми хочемо пройти програму "по кроках" (single-step mode). Для цього потрібно вказати команду, на якій програма має зупинитись. Можна вказати підпрограму – тоді зупинку буде здійснено перед початком виконання інструкцій цієї підпрограми. Ще можна вказати ім'я файлу та номер рядка.

(gdb) b main Breakpoint 1 at 0x8048324: file hello.s, line 17. (gdb)

b - скорочення від break. Усі команди GDB можна скорочувати, якщо це не створює двозначних розшифровок. Запускаємо програму командою run. Ця команда використовується для перезапуску раніше запущеної програми.

(gdb) r Start program: /tmp/hello Breakpoint 1, main () at hello.s:17 17 movl $4, %eax /* помістити номер системного виклику write = 4 Current language: auto; currently asm (gdb)

GDB зупинив програму та чекає команд. Ви бачите команду вашої програми, яка буде виконана наступною, ім'я функції , яка зараз виконується, ім'я файлу та номер рядка. Для покрокового виконання ми маємо дві команди: step (скорочено s) і next (скорочено n). Команда step виконує виконання програми із заходом у тіла підпрограм. Команда next виконує крок за кроком лише інструкції поточної підпрограми.

(gdb) n 20 movl $1, %ebx /* перший параметр - в регістр %ebx */ (gdb)

Отже, інструкцію на рядку 17 виконано, і ми очікуємо, що в регістрі %eax знаходиться число 4. Для виведення на екран різних виразів використовується команда print (скорочено p ). На відміну від команд асемблера, GDB у записі регістрів використовує знак $ замість % . Подивимося, що в регістрі %eax :

(gdb) p $eax $1 = 4 (gdb)

Дійсно 4! GDB нумерує всі виведені вирази. Зараз ми бачимо перший вираз ($1), який дорівнює 4. Тепер до цього виразу можна звертатися на ім'я. Також можна проводити прості обчислення:

(gdb) p $1 $2 = 4 (gdb) p $1 + 10 $3 = 14 (gdb) p 0x10 + 0x1f $4 = 47 (gdb)

Поки ми грали з командою print, ми вже забули, яка інструкція виконується наступною. Команда info line виводить інформацію про вказаний рядок коду. Без аргументів виводить інформацію про поточний рядок.

(gdb) info line Line 20 of "hello.s" starts at address 0x8048329 and ends at 0x804832e . (gdb)

Команда list (скорочено l) виводить на екран вихідний код вашої програми. Як аргументи їй можна передати:

  • номер рядка- Номер рядка у поточному файлі;
  • файл: номер_рядки- Номер рядка у вказаному файлі;
  • ім'я_функції- Ім'я функції, якщо немає неоднозначності;
  • файл: ім'я_функції- ім'я функції у вказаному файлі;
  • *адреса- адреса в пам'яті, за якою розташована необхідна інструкція.

Якщо передавати один аргумент, команда list виведе 10 рядків вихідного коду навколо цього місця. Передаючи два аргументи, ви вказуєте рядок початку та рядок кінця лістингу.

(gdb) l main 12 за межами цього файлу */ 13 .type main, @function /* main - функція (а не дані) */ 14 15 16 main: 17 movl $4, %eax /* помістити номер системного виклику 18 write = 4 в регістр %eax */ 19 20 movl $1, %ebx /* перший параметр помістити в регістр 21 %ebx; номер файлового дескриптора 22 stdout = 1 */ (gdb) l *$eip 0x8048329 is at hello.s:20. 15 16 main: 17 movl $4, %eax /* помістити номер системного виклику 18 write = 4 в регістр %eax */ 19 20 movl $1, %ebx /* перший параметр помістити в регістр 21 %ebx; номер файлового дескриптора 22 stdout = 1 */ 23 movl $hello_str, %ecx /* другий параметр помістити в 24 регістр %ecx; покажчик на рядок */ (gdb) l 20, 25 20 movl $1, %ebx /* перший параметр помістити в регістр 21 %ebx; номер файлового дескриптора 22 stdout = 1 */ 23 movl $hello_str, %ecx /* другий параметр помістити в 24 регістр %ecx; покажчик на рядок */25 (gdb)

Запам'ятайте цю команду: list $eip . З її допомогою ви завжди можете переглянути вихідний код навколо інструкції, що виконується зараз. Виконуємо нашу програму далі:

(gdb) n 23 movl $hello_str, %ecx /* другий параметр помістити в регістр %ecx (gdb) n 26 movl $hello_str_length, %edx /* третій параметр помістити в регістр %edx (gdb)

Чи не правда, стомно щоразу натискати n? Якщо просто натиснути Enter, GDB повторить останню команду:

(gdb) 29 int $0x80 /* викликати переривання 0x80 */ (gdb) Hello, world! 31 movl $1, %eax /* номер системного виклику exit = 1 */ (gdb)

Ще одна зручна команда, про яку варто знати - info registers. Звичайно, її можна скоротити до i r . Їй можна передати параметр - список регістрів, які потрібно надрукувати. Наприклад, коли виконання відбувається у захищеному режимі, нам навряд чи будуть цікаві значення сегментних регістрів.

(gdb) info registers eax 0xe 14 ecx 0x804955c 134518108 edx 0xe 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xb0 1208566592 eip 0x804833a 0x804833a eflags 0x246 [PF ZF IF] cs 0x73 115 ss 0x7b 123 ds 0x7b 123 es 0x7b 123 fs 0x0 0 gs 0x33 51 (gdb) info registers 0xe 14 ecx 0x804955c 134518108 edx 0xe 14 ebx 0x1 1 esp 0xbfabb55c 0xbfabb55c ebp 0xbfabb5a8 0xbfabb5a8 esi 0x0 0 edi 0xb7f6bcc0 -1208566592 eip 0x804833a 0x804 eflags 0x246 [PF ZF IF] (gdb)

Так, а крім регістрів у нас є ще й

Сьогодні ти зробиш ще один крок у справі
Вивчення Linux систем. Я розповім про основні
прийоми під час роботи з gdb. Оволодівши ними, ти зможеш зрозуміти, як працює будь-яка програма, писати свої експлоїти.

Ви, мабуть, усі чули про таку річ як налагоджувач, gdb – це і є наладчик. GDB – GNU
Debugger. Це така собі подоба SoftICE для Windows (для тих хто не знає – найпопулярніший і, на мій погляд, взагалі найкращий налагоджувач), тільки під
Linux системи. Справа в тому, що в мережі не так багато документів, які демонструють роботу цієї речі і свого часу я його освоював сам. Отже,
у документі буде описано базові команди gdb. Все це буде показано на прикладі. А як приклад я вирішив взяти непотрібну прогу yes. Для тих, хто не знає – це програма просто виводить символ 'y' до нескінченності, спочатку я вирішив навчити її виводити не цей символ, а рядок 'XAKEP', хоч веселіше буде.

Ну, а тепер все по порядку. Сам відладчик запускається так:

Але можна вводити різні параметри, у нас це буде шлях до досліджуваної програми:

# gdb /usr/bin/yes

Можна досліджувати core файли, для цього потрібно ввести наступне:

# gdb /usr/bin/yes core

Ще може знадобитися команда для перегляду вмісту регістрів:

(gdb) info registers

або так (скорочений варіант)

Тепер розглянемо, як робити перехоплення. Існують
точки зупинки, точки перехоплення та точки спостереження. Більш конкретно я хотів би зупинитися на точках зупинки. Їх можна встановлювати на:

(gdb) break function - Зупинити перед входом у функцію
(gdb) break *adress - Зупинити перед виконанням інструкції на адресу.

Після встановлення можна переглянути всі точки для цього скористайтеся командою:

(gdb) info break

А потім можна видалити ці точки:

(gdb) clear breakpoint - де break це назва точки зупинки
(наприклад, функція або адреса)

Дуже необхідною річчю є можливість автоматичного відображення різних значень під час виконання програми. Для цього існує команда display:

(gdb) display/format value , де format – це формат відображення, а value – саме вираз, який потрібно відобразити.

Для роботи з відображенням відведено такі команди:

(gdb) info display - видає інфу про відображення
(gdb) delete num - де num – видалити елементи з індексом
num

Це був невеликий довідник із команд, щоб зрозуміти основну ідею.
Далі на прикладі хотілося б продемонструвати це ще трохи. І пам'ятайте – тут я дав лише дуже маленьку частину всіх можливостей gdb, насправді в них їх у сотні разів більше, тому читайте та навчайте.
Як я обіцяв, беремо непотрібну прогу yes. Шлях на вашій машині може не збігатися з моїм, все залежить від операційної системи якої ви користуєтеся, якщо скористайтеся пошуком (команда
find).

# gdb /usr/bin/yes

Після запуску він каже вітальне повідомлення.

GNU gdb 19991004




Це є абсолютно не warranty for GDB. Type "show warranty" for details.
Цей GDB був налаштований як "i386-redhat-linux"...
(no debugging symbols found)...

Так як yes виводить нескінченну кількість символів, то краще б їх нам не бачити у відладчику, а висновок
програми можна направити на іншу консоль. Відкрийте новий термінал, наберіть who is i ви отримаєте ім'я консолі. Повинно вилізти
щось на зразок цього:

Ось тепер просто прив'язуємо до неї.

(gdb) tty /dev/pts/1

А тепер ставимо точку зупинки на функцію puts(), а щоб було зрозуміліше ось вам man-довідка про функцію(команда man
puts)

#include
int puts (const char * s);
puts() writes the string s і trailing newline to std
out.

Як видно, функція надсилаємо рядок s на потік виведення. Ось вона нам і потрібна. На ній ми поки що і зупинимося.

(gdb) break puts
Breakpoint 1 at 0x8048698

І запускаємо саму програму, щоб дочекатися доки gdb не зупинить її виконання на виклик функції.

(gdb) r
Starting program: /usr/bin/yes
Breakpoint 1 at 0x4006d585: файл ioputs.c, line 32.

Breakpoint 1, 0x4006d585 in _IO_puts (str=0x8048e59 "y") at ioputs.c:32
32 ioputs.c: No such file або directory.
1: x/i $eip 0x4006d585<_IO_puts+21>: mov 0x8(%ebp),%esi

О, ось і сталося диво, спрацював breakpoint. Що ми бачимо – а бачимо ми що інше, як параметр функції, точніше адресу, яким він лежить. Що тепер потрібно
зробити? Правильно, підправити дані на цю адресу. При цьому ми затремо ще пару символів своїми.

(gdb) set (char)0x8048e59="X"
(gdb) set (char)0x8048e5a="A"
(gdb) set (char)0x8048e5b="K"
(gdb) set (char)0x8048e5c="E"
(gdb) set (char)0x8048e5d="P"

Ну а тепер подивимося на наш витвір. Що там лежить у пам'яті:

(gdb) x/3sw 0x8048e59
0x8048e59<_IO_stdin_used+437>: "XAKEP\004\b"
0x8048e61<_IO_stdin_used+445>: ""
0x8048e62<_IO_stdin_used+446>: ""

Тепер видалимо наш брякпоінт:

(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x4006d585 in _IO_puts at ioputs.c:32
breakpoint already hit 1 time
(gdb) clear puts
Deleted breakpoint 1

І продовжимо виконання, щоб насолодитися результатом:

От і все. Виходимо.

(gdb) q
The program is running. Exit anyway? (y or n) y

На цьому практика закінчується, решту вивчайте самі і пам'ятайте, що головне в цьому житті – це ВЧЕННЯ.
Ось ще деякі приклади роботи:

Приєднання до працюючого процесу:

// launch gdb
hack@exploit:~ > gdb
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB є free software, що поширюється на GNU General Public License, і ви є
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
Це є абсолютно не warranty for GDB. Type "show warranty" for
details.
Ця GDB була налаштована як "i386-suse-linux".
(gdb) attach "pid"
(gdb) attach 1127 // example

Пошук у пам'яті:

(gdb) x/d або x "address" show decimal
(gdb) x/100s "address" show next 100 decimals
(gdb) x 0x0804846c show decimal at 0x0804846c
(gdb) x/s "address" show strings at address
(gdb) x/105 0x0804846c show 105 strings at 0x0804846c
(gdb) x/x "address" show hexadecimal address
(gdb) x/10x 0x0804846c show 10 addresses at 0x0804846c
(gdb) x/b 0x0804846c
(gdb) x/10b 0x0804846c-10 show byte at 0x0804846c-10
(gdb) x/10b 0x0804846c+20 show byte at 0x0804846c+20
(gdb) x/20i 0x0804846c show 20 assembler instructions at address

Список усіх секцій у виконуваному файлі:

(gdb) maintenance info sections // or
(gdb) mai i s

Executable file:
`/home/hack/homepage/challenge/buf/basic", тип файлу
elf32-i386.
0x080480f4->0x08048107 at 0x000000f4: .interp ALLOC

0x08048108->0x08048128 at 0x00000108: .note.ABI-tag
ALLOC LOAD READONLY DATA HAS_CONTENTS
0x08048128->0x08048158 at 0x00000128: .hash ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x08048158->0x080481c8 at 0x00000158: .dynsym ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x080481c8->0x08048242 at 0x000001c8: .dynstr ALLOC
LOAD READONLY DATA HAS_CONTENTS
0x08048242->0x08048250 at 0x00000242: .gnu.version
ALLOC LOAD READONLY DATA
HAS_CONTENTS

Шлюб на адресу:

(gdb) disassemble main
Dump of assembler code for function main:
0x8048400

: push %ebp
0x8048401 : mov %esp,%ebp
0x8048403 : sub $0x408,%esp
0x8048409 : add $0xfffffff8,%esp
0x804840c : mov 0xc(%ebp),%eax
0x804840f : add $0x4,%eax
0x8048412 : mov (%eax),%edx
0x8048414 : push %edx
0x8048415 : lea 0xfffffc00(%ebp),%eax
...

(gdb) break *0x8048414 // example
Breakpoint 1 at 0x8048414
(gdb) break main // example
Breakpoint 2 at 0x8048409
(gdb)

GNU Debugger – переносний налагоджувач проекту GNU, який працює на багатьох UNIX-подібних системах і вміє робити налагодження багатьох мов програмування, включаючи Сі, C++, Ada та Фортран. GNU Debugger – це вільне програмне забезпечення, яке розповсюджується за ліцензією GNU General Public License.

Спочатку GNU Debugger написаний Річардом Столлманом у 1988 році. За основу було взято відладчика DBX, що поставлявся з дистрибутивом BSD. З 1990 до 1993 року. проект підтримувався Джоном Джилмором під час його роботи в компанії Cygnus Solutions. В даний час розробка координується Керуючим комітетом GDB (GDB Steering Committee), призначеним Free Software Foundation.

Технічні деталі GNU Debugger

  • Особливості

GNU Debugger пропонує великі засоби для стеження та контролю за виконанням комп'ютерних програм. Користувач може змінювати внутрішні змінні програм і навіть викликати функції незалежно від звичайної поведінки програми. GNU Debugger може налагоджувати виконувані файли у форматі a.out, COFF (у тому числі виконувані файли Windows), ECOFF, XCOFF, ELF, SOM, використовувати налагоджувальну інформацію у форматах stabs, COFF, ECOFF, DWARF, DWARF2. Найбільші можливості налагодження надає формат DWARF2.

GNU Debugger активно розвивається. Наприклад, у версії 7.0 додана підтримка «оборотної налагодження», що дозволяє відмотати процес виконання, щоб подивитися, що сталося. Також у версії 7.0 було додано підтримку скриптингу на .

Для роботи з GNU Debugger були створені й інші інструменти налагодження, наприклад, датчики витоку пам'яті.

  • Мультиплатформність та підтримка вбудованих систем

GNU Debugger може бути скомпільований для підтримки програм для кількох цільових платформ і перемикатися між ними під час налагоджувальної сесії. Процесори, що підтримуються GNU Debugger (2003): Alpha, ARM, H8/300, System/370, System/390, x86 та x86-64, IA-64 (Itanium), Motorola 68000, MIPS, PA-RISC, PowerPC, SuperH , SPARC, VAX, A29K, ARC, AVR, CRIS, D10V, D30V, FR-30, FR-V, Intel i960, M32R, 68HC11, Motorola 88000, MCORE, MN10200, MN10300, NS32K, NS32K. (Більше нові випуски не будуть, ймовірно, підтримувати деяких з них.) Цільові платформи, на яких GNU Debugger не може бути запущений, зокрема вбудовані системи, можуть підтримуватися за допомогою вбудованого симулятора (процесори ARM, AVR), або додатки для них можуть бути скомпільовані зі спеціальними підпрограмами, що забезпечують віддалену налагодження під керуванням GNU Debugger, запущеному на комп'ютері розробника. Вхідним файлом для налагодження, як правило, використовується не прошиваемий двійковий файл, а файл в одному з форматів, що підтримують налагоджувальну інформацію, в першу чергу ELF, з якого згодом за допомогою спеціальних утиліт витягується двійковий код для прошивки.

  • Віддалене налагодження

При віддаленому налагодженні GNU Debugger запускається на одній машині, а програма, що відладжується, запускається на іншій. Зв'язок здійснюється за спеціальним протоколом через послідовний порт або TCP/IP. Протокол взаємодії з відладчиком є ​​специфічним для GNU Debugger, але вихідні коди необхідних підпрограм включені в архів відладчика. Як альтернатива, на цільовій платформі може бути запущена програма gdbserver, що використовує той же протокол, зі складу пакету GNU Debugger, що виконує низькорівневі функції на кшталт встановлення точок зупинки і доступу до регістрів і пам'яті.

Цей режим використовується для взаємодії з вбудованим налагодженням ядра Linux KGDB. З його допомогою розробник може налагоджувати ядро ​​як звичайну програму: встановлювати точки зупинки, робити покрокове виконання коду, переглядати змінні. Вбудований відладчик вимагає двох машин, з'єднаних через Ethernet або послідовний кабель, на одному з яких запущений GNU Debugger, на іншому - ядро, що налагоджується.

  • Користувальницький інтерфейс

Відповідно до ідеології провідних розробників Free Software Foundation, GNU Debugger замість власного графічного інтерфейсу надає можливість підключення до зовнішніх IDE, керуючих графічних оболонок або використовувати стандартний консольний текстовий інтерфейс. Для сполучення із зовнішніми програмами можна використовувати мову текстового рядка (як це було зроблено в перших версіях оболонки DDD), текстова мова керування gdb/mi або інтерфейс для мови .

Були створені такі інтерфейси як DDD, cgdb, GDBtk/Insight і GUD mode в . З GNU Debugger можуть взаємодіяти такі IDE, як

Для ефективного налагодження програми, при компіляції ви повинні згенерувати налагоджувальну інформацію. Ця налагоджувальна інформація зберігається в об'єктному файлі; вона описує тип даних кожної змінної або функції, і відповідність між номерами рядків вихідного тексту та адресами у коді, що виконується.

Щоб запросити генерацію налагоджувальної інформації, вкажіть ключ `-g" під час запуску компілятора.

Багато компіляторів Сі не можуть обробляти ключі `-g" та `-O" разом. Використовуючи такі компілятори, ви не можете створювати оптимізовані файли, що містять налагоджувальну інформацію.

GCC, GNU компілятор Сі, підтримує `-g" з або без `-O" , уможливлюючи налагодження оптимізованого коду. Ми рекомендуємо, щоб ви завждиВи використовували `-g" при компіляції програм. Ви можете думати, що ваша програма правильна, але немає сенсу зазнавати успіху.

Якщо ви запускаєте вашу програму в середовищі виконання, що підтримує процеси, run створює підлеглий процес, і цей процес виконує вашу програму. (У середовищах, що не підтримують процеси, run виконує перехід на початок вашої програми.)

Виконання програми залежить від певної інформації, яку вона отримує від процесу, що її породив. GDB надає способи задати цю інформацію, що ви повинні зробити дозапуск програми. (Ви можете змінити її після старту, але такі зміни впливають на вашу програму лише при наступному запуску.) Ця інформація може бути поділена на чотири категорії: Параметри.Вкажіть параметри, які потрібно передати вашій програмі, як параметри команди run . Якщо на вашій системі є оболонка, вона використовується для передачі параметрів, так що при їх описі ви можете використовувати звичайні угоди (такі як розкриття шаблонів або підстановка змінних). У системах Unix, ви можете контролювати, яка оболонка використовується за допомогою змінного середовища SHELL . розділ 4.3 Аргументи вашої програми. Середа.Зазвичай ваша програма успадковує своє середовище від GDB, але ви можете використовувати команди GDB set environment та unset environment , щоб змінити частину налаштувань середовища, що впливають на неї. розділ 4.4 Робоче середовище вашої програми. Робочий каталогВаша програма успадковує свій робочий каталог від GDB. Ви можете встановити робочий каталог GDB командою cd. розділ 4.5 Робочий каталог вашої програми. Стандартне введення та виведення.Зазвичай ваша програма використовує ті ж пристрої для стандартного введення та виводу, що й GDB. Ви можете перенаправити введення та виведення в рядку команди run, або використовувати команду tty, щоб встановити інший пристрій для вашої програми. розділ 4.6 Введення та виведення програми . Попередження:Хоча перенаправлення введення та виведення працює, ви не можете використовувати канали для передачі вихідних даних програми, що відладжується іншій програмі; якщо ви спробуєте це зробити, швидше за все GDB перейде до налагодження неправильної програми.

Коли ви подаєте команду run, ваша програма починає виконуватися негайно. Див. розділ 5. Зупинення та продовження виконання , щоб обговорити, як зупинити вашу програму. Як тільки ваша програма зупинилася, ви можете викликати функції програми, використовуючи команди print або call . розділ 8. Дослідження даних .

Якщо час модифікації вашого символьного файлу змінився з того моменту, коли GDB востаннє зчитував символи, він знищує свою символьну таблицю та зчитує її знову. При цьому GDB намагається зберегти ваші поточні точки зупинки.

4.3 Аргументи вашої програми

Перше, що GDB робить після підготовки до налагодження зазначеного процесу - зупиняє його. Ви можете досліджувати та змінювати приєднаний процес усіма командами GDB, які зазвичай доступні, коли ви запускаєте процеси за допомогою run . Ви можете встановлювати точки зупинки; ви можете покроково виконувати програму та продовжити її звичайне виконання, ви можете змінювати області даних. Якщо ви вирішите продовжити виконання процесу після приєднання до нього GDB, можна використовувати команду continue . detach Коли ви закінчили налагодити приєднаний процес, для його звільнення з-під керування GDB ви можете використовувати команду detach . Від'єднання процесу продовжує його виконання. Після команди detach цей процес і GDB знову стають абсолютно незалежними, і ви готові приєднати або запустити за допомогою run інший процес. detach не повторюється, якщо ви натиснете RET ще раз після виконання команди.

Якщо ви вийдете з GDB або використовуєте команду run, поки у вас є приєднаний процес, ви вб'єте цей процес. За промовчанням, GDB запитує підтвердження, якщо ви намагаєтеся зробити одну з цих речей; ви можете контролювати, чи потрібно вам це підтвердження чи ні, використовуючи команду set confirm (див. розділ 15.6 Необов'язкові попередження та повідомлення).

4.8 Знищення дочірнього процесу

kill Знищити дочірній процес, в якому ваша програма виконується під керуванням GDB.

Ця команда корисна, якщо ви хочете налагодити дамп пам'яті, а не процес, що виконується. GDB ігнорує будь-які дампи пам'яті, поки програма виконується.

У деяких операційних системах програма не може бути виконана поза GDB, поки у вас є в ній точки зупинки, встановлені відладчиком. У цій ситуації ви можете використовувати команду kill, щоб дозволити виконання вашої програми поза відладчиком.

Команда kill також корисна, якщо ви хочете перекомпілювати і перекомпонувати вашу програму, так як у багатьох системах неможливо модифікувати файл, що виконується під час виконання процесу. У цьому випадку, коли ви введете наступний раз run , GDB помітить, що файл змінився, і заново прочитає символьну таблицю (намагаючись при цьому зберегти ваші точки зупинки).