GNU Debugger се използва за отстраняване на грешки в програма, за анализ на срива или за да видите какво прави програмата в определен момент. Той е разработен от проекта GNU през 80-те години на миналия век и е един от най-широко използваните програми за отстраняване на грешки в командния ред, както и един от най-популярните софтуери на GNU.
Нека първо напишем малка C програма, която след това ще отстраним грешките. За да започнете, създайте нов .° С
файл с помощта на vim
или всеки редактор по ваш избор:
vim test.c
Създайте следната C програма:
#include int main() { int i = 5; float f = 5,5 i = i + 3; f = f + 2,2; printf("Стойността на i и f са: %d и %f\n", i, f); връщане на 0; }
Натиснете Бягство
за да отидете в команден режим vim. След това напишете :wq
за да запазите програмата и да излезете.
Компилирайте и вижте дали програмата работи:
gcc test.c -o test ./test Стойността на i и f са: 8 и 7,700000
За да активирате поддръжката за отстраняване на грешки в програма, ние го компилираме с -ж
флаг. Ако флагът не се използва, потребителят все още може да отстрани грешки в програмата, макар и с ограничени опции.
gcc test.c -g -o тест
За да започнете да отстранявате грешки нашия изпълним файл тест
в gdb
, ние бягаме:
gdb тест
Ще отвори gdb
конзола, където можете да въведете gdb
команди. За да видите списък с команди, използвайте помогне
команда.
$(gdb) help Списък с класове команди: псевдоними -- Псевдоними на точки на прекъсване на други команди -- Принудително спиране на програмата в определени точки данни -- Проверка на файлове с данни -- Уточняване и проверка на вътрешните файлове на файлове -- Неясни команди за поддръжка -- Неясни функции , които се изпълняват -- Изпълнение на програмния стек -- Проверка на състоянието на стека -- Поддръжка на запитвания за състоянието -- Точки за проследяване на средства за поддръжка -- Проследяване на изпълнението на програмата без спиране на програмата, дефинирана от потребителя -- Дефинирани от потребителя команди Въведете "help", последвано от име на клас за списък с команди в този клас. Въведете "помощ на всички" за списъка с всички команди. Въведете "помощ", последвано от име на командата за пълна документация. Въведете "apropos word", за да търсите команди, свързани с "word". Съкращенията на имената на командите са разрешени, ако са недвусмислени.
След това можете да въведете помощ име_на клас
за да видите команди, принадлежащи към този клас. За да търсите команди с помощта на подниз, използвайте по отношение на подниз
.
За да зададете точка на прекъсване, когато програмата влезе във функция, бягай:
$(gdb) прекъсване на главния
Тук задаваме точка на прекъсване на единствената функция в нашия код, т.е. главен
. Използвайте командата бягай
за да изпълни програмата до следващата точка на прекъсване или до изход.
$(gdb) стартиране
За да зададете точка на прекъсване на определено място във функция, използвайте:
прекъсване *основен + 4
Това ще настрои точка на прекъсване на 4-ти ред на основната функция.
Сега, за да преминете през потока на програмата към следващия ред код, просто стартирайте стъпка
команда.
$(gdb) стъпка 5: float f = 5,5;
За да покажете съдържанието на променлива, бягай дисплей
.
$(gdb) показва i 6: i = 5
За да промените съдържанието на променлива, което може да е необходимо за анализиране на изпълнението на програма при специфични стойности на променлива, run задайте променлива =Израз
.
$(gdb) задайте променлива i=10 $(gdb) дисплей i 7: i = 10
Тук „Изразът“ може да бъде всеки валиден (аритметичен/логически) израз. За простота просто присвояваме друга стойност (10) на променливата и
.
За да отпечатате асемблерния код за програмата, използвайте команда разглобяване име на функция
:
Използвайте само разглобявам
за отпечатване на асемблерния код за цялата програма. Обърнете внимание на стрелката на конкретен ред в кода за сглобяване. Означава, че сесията за отстраняване на грешки в момента е на пауза в това конкретно място в паметта (т.е. този ред код).
За да прескочите дебъгера към определен ред код, бягай:
$(gdb) jump *main + 2 Продължава на 0x400528. Точка на прекъсване 2, 0x0000000000040052a в main () при test.c:3 3 int main() { 1: i = 2: f = 3: h = (void *) 0x0 4: main = {int ()} 0x400526 5: i =
Това ще накара дебъгера да прескочи в паметта на втория ред код във функцията главен
. Имайте предвид, че тук скочих от началото на основното директно към второто местоположение. Следователно, променлива и
никога не е бил зададен, което води до грешка на дебъгера, че не може да получи достъп до съдържанието на паметта на адреса на променливата и
.
Това са някои от основните команди, които могат да ви помогнат да започнете с отстраняването на грешки в изпълним файл в Linux. Надяваме се, че информацията на тази страница ще ви бъде полезна.