Забавление със strace и GDB дебъгера
Придобийте нови знания, като научите за вашата UNIX система
Семейството на UNIX винаги е гъмжило от възможности за потребителите. UNIX е съкровищница от помощни програми, които можете не само да използвате продуктивно, но и да научите и да се отдадете на изследване на дълбините на операционната система. Двете полезни помощни програми, от които се нуждаем, са strace, която ви позволява да проследявате извикванията на всяка програма, и GDB дебъгерът, който е пълнофункционален дебъгер, който ви позволява да изпълнявате програми в контролирана среда.
UNIX е проектиран така, че стотици извиквания на функции (наречени системни извиквания) изпълняват прости задачи, като например задаване на задача за приоритизиране на показването на знаци на екрана. Всички UNIX програми изпълняват задачите си, като извикват тези услуги на ниско ниво, предоставени от операционната система, и с помощната програма strace можете да наблюдавате тези извиквания и параметрите, използвани за тях в реално време. Можете наистина да си играете с програмите, като научите техните връзки на ниско ниво с операционната система.
Да започнем играта
Нека започнем, като разгледаме проста UNIX команда, pwd, и видим какво прави командата. Трябва да стартирате xterm, за да създадете контролирана среда за експерименти и да въведете следната команда:
Командата pwd показва текущата работна директория. Резултатът (на командата) на моя компютър по това време беше:
Така една проста функция опровергава очевидната сложност на програмата (между другото, всички компютърни програми правят това). За да получите пълна представа за цялата сложност, трябва да изпълните отново командата pwd с помощната програма strace:
С тази команда можете да видите какво се случва на UNIX машина, само за да намерите и отпечатате текущияработната директория на потребителя (списък 1).
Листинг 1. Конзолен изход на командата strace pwd
Основи на UNIX системните повиквания
Няма да навлизаме в подробности защо са необходими всички тези системни извиквания за получаване и показване на текущата работна директория, тъй като това е извън обхвата на тази статия, но ще ви покажа как да получите тази информация. Във всеки ред от листинг 1, системно извикване с параметри се извежда в C-подобен формат, точно както C програмистите биха очаквали. strace винаги показва повикванията по този начин, независимо от действителния език за програмиране, използван при писане на програмата.
Ако искате да разберете всички детайли на изхода в листинг 1, UNIX предоставя изобилие от документация за всички системни извиквания. Най-важната функция там е функцията getcwd(), която ви позволява да получите текущата работна директория. Текущият xterm показва изхода на strace pwd, така че можете да стартирате друг xterm и да въведете същата команда, за да видите какво извежда UNIX за тази функция:
Трябва да се отпечата пълен списък на функцията getcwd() и списък на аргументите, които тази важна C функция приема и връща. По същия начин можете да въведете man brk или man fstat64 и т.н. Тези системни функции обикновено са добре документирани и ако отделите време да ги проучите, ще разберете истинската мощ на UNIX и колко лесно е да се извърши системен анализ на ниско ниво. От всички операционни системи UNIX е най-добрата по отношение на разбирането какво се случва вътре и извън системата.
Преглед на уеб
След това се нуждаете от нещо по-голямо и по-сложно от проста UNIX команда като pwd. Един прост сървър с протокол за прехвърляне на хипертекст (HTTP) като nweb ще работи добре. HTTP сървърът слуша за уеб заявкибраузър, когато сърфирате в интернет и изпраща заявени обекти, като уеб страници и графични файлове, при тези заявки.
След като изтеглите архива es-nweb.zip в папката $HOME/downloads, трябва да въведете прости команди, за да извлечете, компилирате и стартирате програмата (списък 2):
Забележка. Очаква се програмата да бъде компилирана на работна станция Linux®. Ако това не е така, тогава трябва да прочетете помощта на nweb за подробности относно компилирането на програмата за други разновидности на UNIX.
Листинг 2. Команди за извличане, компилиране и изпълнение на nweb
Забележка: Опцията -ggdb в списък 2 се различава от статията на Nigel и инструктира GCC компилатора да оптимизира програмата за отстраняване на грешки в GDB дебъгера, който ще бъде използван по-късно.
След това трябва да проверите дали сървърът nweb работи, като използвате командата ps, за да покажете резултатите от проверката (списък 3).
Списък 3. ps команда
Използване на strace с nweb
Време е да започнете да проучвате. Нека стартираме друг xterm и използваме strace за проследяване на работещия nweb сървър. За да направите това, трябва да знаете идентификатора на процеса на програмата и да имате съответните права за достъп. Ще разгледаме само определени системни повиквания - тези, които са свързани с мрежата. Първата стъпка е да издадете командата, показана в първия ред на листинг 4, като използвате ID на процеса nweb, който беше отпечатан по-рано. Трябва да се покаже следният изход - ред 2 на списък 4.
Списък 4. Изпълнение на nweb трасиране
Обърнете внимание, че проследяването спира по средата на извикване на мрежовата функция accept(). Трябва да опресните страницата http://localhost:9090 във вашия уеб браузър няколко пъти, за да видите какво показва strace всеки път, когато страницата се опреснява.Не е ли страхотно? Виждаме мрежови повиквания на ниско ниво към nweb HTTP сървъра, направени от уеб браузъра. Буквално казано, nweb приема заявки от уеб браузър.
Можете да спрете проследяването на мрежови повиквания от работещ nweb процес, като натиснете Ctrl+C, когато текущият прозорец на xterm изпълнява strace.
GDB дебъгер
Както е показано, strace може да бъде чудесен инструмент за научаване как потребителските програми взаимодействат с операционната система чрез определени системни извиквания. GDB дебъгерът може също да се прикачи към текущия процес, като ви помага да копаете по-дълбоко.
GDB дебъгерът е доста полезен, така че в интернет има много информация за него. Дебъгерите обикновено са важни помощни програми и всеки, който отговаря за разработването и поддръжката на компютърни системи, трябва да е запознат с тях. Докато nweb работи в друга xterm сесия, спрете strace, като натиснете Ctrl+C и стартирайте GDB дебъгера, като напишете командите, показани в списък 5.
Списък 5. Стартиране на GDB дебъгера
Опцията --quiet инструктира GDB да показва само подсказки, а не цялата друга начална информация, която обикновено се показва. Ако искате да видите допълнителен текст, пропуснете опцията --quiet.
Командата attach 4009 започва отстраняване на грешки в работещия в момента nweb сървър и GDB дебъгерът отговаря, като прочита цялата възможна информация за процеса. След това трябва да използвате командата info, за да получите информация за въпросната програма (списък 6).
Листинг 6. Командата info показва информация за програмата
Друг полезен вариант на командата info са функциите info, но списъкът с функции може да стане много дълъг (списък 7).
Листинг 7. Функции, изброени с командата info functions
Тъй като програмата nweb беше компилирана с опцията -ggdb, много информация за отстраняване на грешки беше включена в изпълнимия файл, позволявайки на програмата за отстраняване на грешки да види описанията на функциите, дадени във файла, както е показано в листинг 7.
изброяване и разглобяване на команди
Двете най-важни GDB команди са list и disassemble. Нека да видим как работят тези команди с примерния код в листинг 8.
Листинг 8. команда list
Както можете да видите, командата list показва изходния код за изпълняваната програма с номера на редове. Натискането на клавиша за връщане (показан между редове 130 и 131) просто продължава списъка там, където е спрял. Сега трябва да въведете командата за разглобяване, която може да бъде съкратена до disass (списък 9).
Листинг 9. команда за разглобяване
Това е изходът на асемблерния код от основната функция. В този случай асемблерният код показва, че изпълняваният код се изпълнява на процесор Intel® Pentium®. Кодът ще изглежда напълно различно, ако го стартирате на компютър с различен тип процесор, като например IBM Power PC® компютър.
Мониторинг на работеща програма
Тъй като наблюдавате действителното изпълнение на програмата, можете да зададете точки на прекъсване и да видите как програмата отговаря на заявките на уеб браузъра и предава .html и .jpg файлове на браузъра при поискване. Как се прави това е показано в списък 10.
Листинг 10. Задаване на точки на прекъсване
В този момент GDB дебъгерът задава прекъсваща линия, когато nweb сървърът получи заявка за уеб браузър; дебъгерът просто ще покаже подкани и ще продължи обработката, без да прекъсва изпълняваната програма. Необходимо е да опресните страницата http://localhost:9090/ в уеб браузъра няколко пъти и можете да видите, че GDB дебъгерът ще достигне точката на прекъсване и ще продължи.
Листинг 11. Информация за точките на прекъсване на GDB дебъгера в xterm
Имайте предвид, че когато GDB прекрати програма, самата програма остава активна в паметта. Веднага след като отстраняването на грешки приключи, можете да опресните страницата във вашия уеб браузър и да видите, че nweb все още работи. Можете да спрете програмата, като напишете kill 4009 или страницата ще изчезне, когато сесията приключи.
Както обикновено, можете да научите много за помощни програми като strace и GDB от техните man и info страници. Чувствайте се свободни да използвате помощните програми, предоставени от UNIX!
Научете колкото е възможно повече
Би било хубаво да знаете колкото е възможно повече за компютъра, на който работите, и още по-добре - да се наслаждавате на процеса на работа. UNIX наистина насърчава прегледа и изучаването на помощни програми като strace и GDB дебъгера, както и предоставя много информация в техните man и info страници. Компютърът е продължение на нашия мозък и колкото повече знаем за него, толкова по-полезен е той.