Побољшајте квалитет кода и спречите неочекиване резултате тако што ћете научити како да користите ГНУ Дебуггер за откривање нежељених грешака у вашем коду.

Отклањање грешака је неопходна вештина за програмере и истраживаче безбедности. Снажно разумевање отклањања грешака омогућава вам да разумете извршни фајл на нижем нивоу и ухватите све скривене грешке.

ГНУ дебагер или, ГДБ, је безвременски алат за отклањање грешака на који се програмери ослањају већ годинама. Ево како да користите ГДБ на Линук-у.

Припрема узорака програма

Да бисте истражили карактеристике ГДБ-а, биће вам потребан извршни фајл за експериментисање. За демонстрацију, покренућете ГДБ у програму за проверу кључева једном са доступним изворним кодом и симболима за отклањање грешака, једном без изворни код, и на једноставном вишенитном програму који штампа поруке на екран, и написане у Ц-у и компајлиране са ГЦЦ (ГНУ Ц компајлер).

Можете користите било који други Ц компајлер али пазите да не скинете бинарни фајл.

Највероватније ћете покретати ГДБ на сопственим програмима. Зато се побрините да их саставите са

означите са гцц-ом да бисте омогућили симболе за отклањање грешака.

Без присутних симбола за отклањање грешака и са јако лишеним бинарним програмом, мораћете да отклоните грешке у растављању програма. Ово ће захтевати од вас да добро разумете језик асемблера и како алокација меморије функционише на Линук-у да разуме податке у стеку и регистрима.

Покретање програма у ГДБ

Програм у ГДБ-у покрећете на неколико начина. Или укуцајте гдб , и када се учита, откуцајте трцати. Или покрените гдб, а затим користите фајл наредбу, учитајте бинарну датотеку у гдб, а затим је извршите помоћу трцати команда.

Ако ваш програм захтева аргументе командне линије да би исправно функционисао, обавезно додајте аргументе иза имена програма. Ево синтаксе за учитавање програма у ГДБ и његово извршавање са аргументима:

gdb 
run

Или:

gdb
file
run

Постављање тачака прекида помоћу ГДБ-а

Тачке прекида у отклањању грешака су ручно постављене чврсте стопе у коду које заустављају ток извршења када програм достигне тачку прекида. Постављање тачака прекида вам омогућава да пређете кроз код и проверите како свака фаза извршења утиче на податке и варијабле.

У ГДБ-у, када отклањате грешке у програму помоћу симбола за отклањање грешака, можете поставити тачку прекида према имену функције или поставити тачку прекида на основу броја реда. Ево синтаксе:

break main
break 47

Да бисте видели све тачке прекида у тренутној сесији отклањања грешака, откуцајте:

info breakpoints

Да бисте избрисали одређену тачку прекида или више тачака прекида, откуцајте:

delete 2
delete 3-5

ГДБ вам такође омогућава да поставите условне тачке прекида, што значи да ће се програм зауставити само ако је одређени услов задовољен током извршавања. То може бити промена вредности променљиве или неуспешан позив функције или било шта што желите. Ево синтаксе за постављање условних тачака прекида:

break  if n == 2

Ако желите да наставите са извршавањем програма након што сте погодили тачку прекида, унесите Настави команда:

continue

Корак кроз код

Пролазак кроз код је кључан за разумевање како програм рукује подацима. Корачањем кроз различите функције у вашем програму и испитивањем стања података, можете боље разумети како програм имплементира логику коју сте написали у коду.

Такође вам помаже да откријете корен кварова и проучите понашање програма са хируршком прецизношћу јер можете да пређете кроз сваки ред кода како желите. Можете да пређете кроз код на три основна начина у ГДБ:

  1. Корак: Ова команда говори ГДБ-у да уђе у следећи ред изворне датотеке. Ово вам омогућава да у суштини прелазите дужину изворног кода ред по ред.
  2. следећи: Ова команда извршава следећи ред изворног кода унутар тренутне функције, а затим се зауставља. следећи третира функцију као једну линију, тако да ако користите нект пре позива функције, она ће је третирати као једну линију и прећи преко ње, за разлику од Корак команда.
  3. завршити: Команда за завршетак извршава све преостале линије унутар тренутне функције и затим се зауставља.

Испитивање променљивих

Док корачате кроз код, желели бисте да испитате вредност променљивих да бисте видели како их програмска логика мења. Ево синтаксе за преглед вредности променљивих у ГДБ:

print 

У случају да желите да одштампате промене вредности променљиве сваки пут када се ажурира, требало би да користите команду дисплаи. Ово је посебно корисно када желите да пратите и одштампате вредност променљиве у петљи:

display 

Постављање тачака надзора

Тачке надзора и условне тачке прекида су уско повезане јер обе реагују на промене у програму. Тачке надзора се користе за праћење промена података у коду. На пример, можда желите да се програм прекине сваки пут када се промени вредност променљиве. Ево како то учинити са ГДБ:

watch 

Отклањање грешака специфично за нити са ГДБ

ГДБ вам омогућава да извршите отклањање грешака специфичних за нити када радите са вишенитним програмима. За демонстрацију, радићемо са једноставним Ц програмом који користи четири нити за штампање порука са сваком нити.

Да бисте видели тренутно покренуте нити у вашем програму, користите инфо команда:

info threads

Да бисте радили са одређеном нити, можете је изабрати са листе користећи њен индексни број. На пример:

thread 2

Након што изаберете нит, можете да пређете кроз њен ток извршавања користећи Корак, следећи, и завршити команде као што је горе приказано.

Даљинско отклањање грешака са ГДБ

Такође можете даљински да отклањате грешке у програмима који се налазе на другом систему. Да бисте то урадили, морате да подесите гдбсервер на циљној машини. Можете га лако инсталирати користећи подразумевани менаџер пакета ваше дистрибуције или друге менаџере пакета које сте инсталирали на вашем систему.

На пример, да бисте инсталирали гдбсервер на своје Убунту или Дебиан системе, користите АПТ:

sudo apt install gdbserver

Једном инсталиран, померите се у фасциклу бинарног фајла и покрените ову команду да покренете гдбсервер:

gdbserver :

гдбсервер би требало да врати излаз да је покренут и слуша на порту који сте дефинисали. Сада на клијентској машини покрените ГДБ, а затим се повежите са удаљеним сервером помоћу циљ команда:

target remote :

Писање ГДБ скрипти за аутоматизацију отклањања грешака

ГДБ дозвољава програмерима да пишу ГДБ скрипте које ће аутоматски извршавати ГДБ команде. Ово изузетно помаже када покушавате да отклоните грешке у истом делу кода више пута. Уместо да постављате тачку прекида, прелазите кроз код и штампате вредности променљивих сваки пут када учитате бинарни фајл, можете користити ГДБ скрипту да аутоматизујете цео процес.

Ево примера:

set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit

У горњој скрипти, говорите ГДБ-у да омогући евидентирање и сачува евиденцију у датотеци под називом узорак.оут, а затим поставите тачку прекида на главни функција.

За тачку прекида број 1, у овом случају, тачку прекида у функцији маин, покрените следеће команде: бацктраце, принт, Настави. У суштини, ГДБ ће прво покренути праћење уназад, затим одштампати вредност променљиве "Н", наставити са извршавањем и коначно затворити.

Да бисте извршили ову скрипту, користите:

gdb -x