Как да деблокирате програма C или C ++ на Linux Използване на gdb
Нормалният процес за разработване на компютърни програми е нещо като това: напишете някакъв код, компилирайте кода, стартирайте програмата. Ако програмата не работи както се очаква, върнете се обратно към кода, за да потърсите грешки (бъгове) и повторете цикъла отново.
В зависимост от сложността на програмата и характера на програмните грешки, има моменти, когато можете да направите допълнителна помощ при проследяването на грешките. Това прави "дебъгер". Той ви позволява да изследвате компютърна програма, докато тя работи. Можете да видите стойностите на различните променливи, можете да изследвате съдържанието на паметта и да можете да спрете програмата в определена точка и да стъпите през кода един ред наведнъж.
Основният дебъгер на Linux е GNU дебъгер (gdb). Може би вече е инсталирана на вашата система (или по-слаба версия, наречена gdb-minimal), но за да сте сигурни, въведете следната команда в терминал:
sudo apt-get инсталирате gdb
За да използвате дебъгер, трябва да кажете на компилатора да включи информация за отстраняване на грешки в двоичното. Създайте файл, наречен "hello10.c", използвайки нано:
nano hello10.c
Копирайте и поставете в следния код:
#include главното () {int i; за (i = 0; i <10; i ++) printf ("% d", i); }
Флагът "-g" указва на компилатора да генерира информация за отстраняване на грешки, така че да се компилира използването на програмата:
gcc -g -o hello10 hello10.c
За да стартирате отстраняването на грешки от типа на програмата:
gdb hello10
В този момент, ако просто стартирате програмата (използвайки командата "Run"), програмата ще се изпълни и завърши, преди да получите шанс да направите нещо. За да го спрете, трябва да създадете "точка на прекъсване", която ще спре програмата в определена точка. Най-лесният начин да направите това е да кажете на дебъгера да спре във функцията "main ()":
почивка основен
Сега стартирайте програмата:
тичам
Програмата за отстраняване на грешки е спряла на първата изпълнителна линия на кода, например "за". За да преминете към следващия ред, напишете кратко "следващ" или "n". Продължете да използвате "следващия", за да повтаряте около цикъла няколко пъти:
За да проверите стойността на променлива, използвайте командата "print". В нашата примерна програма можем да разгледаме съдържанието на променливата "i":
отпечатване i
Повторете около цикъла и още няколко пъти и вижте как се променят "i":
следващ следващ следващ следващ печат i
В горния пример "i" е достигнал стойност 4. Обикновената линия ще продължи, докато "i" е по-малко от 10. Можете да промените стойността на променливата чрез "set var." Въведете следното в gdb, за да зададете "i" на 10.
задайте var i = 10 print i next
Може да се наложи да направите още една "следваща" (в зависимост от това къде програмата е била спряна, когато сте задали "i" до 10), но след като линия "loop" е изпълнена, веригата ще излезе, защото "i" по-малко от 10.
Следващата команда не проследява функциите, а функцията се изпълнява, а дебъгващият инструмент спира отново на следващия ред след функцията. Ако искате да влезете в дадена функция, използвайте командата "стъпка" или "s" за кратко.
Друг начин за отстраняване на грешки в програмата ви е да зададете часовник на променлива. Това, което прави това, е спиране на програмата, когато променливата се промени. Рестартирайте отново програмата, като въведете "Run". Тъй като програмата вече работи, дебъгорът ще ви попита дали искате да го стартирате отново от самото начало.
Програмата ще спре в основното (тъй като не премахнахме точката на прекъсване). Сега поставете часовник на "i":
гледам да продължа
Командата "продължаване" стартира отново програмата до следващото условие за прекъсване. В този случай тя ще се изпълни отново, докато променливата "i" не се промени (поради часовника).
За да спрете отстраняването на грешки, просто използвайте командата "quit".
Ако искате да научите повече за gdb, добре да започнете е документацията на GDB. Ако имате проблеми с посочените по-горе примери, моля, използвайте секцията за коментари по-долу и ще видим дали можем да помогнем.