Розваги зі strace та відладчиком GDB

Отримайте нові знання, вивчаючи UNIX-систему

Сімейство UNIX завжди рясніло можливостями для користувачів. UNIX - скарбниця утиліт, які можна не лише продуктивно використовувати, але також навчатися та балувати себе дослідженням глибин операційної системи. Дві корисні утиліти, потрібні нам - це strace, яка дозволяє виконувати трасування викликів будь-яких програм, і відладчик GDB, який є повнофункціональним відладчиком, що дозволяє запускати програми в контрольованому оточенні.

UNIX задуманий так, що сотні функціональних викликів (званих системними викликами) виконують прості завдання, наприклад, задати завдання пріоритетів відображення символів на екрані. Всі UNIX-програми виконують свої завдання, викликаючи ці низькорівневі служби, які надає операційна система, а за допомогою утиліти strace можна в реальному часі стежити за цими викликами та параметрами, що використовуються для них. Можна реально пограти із програмами, вивчивши їх низькорівневі взаємозв'язки з операційною системою.

Почнемо гру

Почнемо з розгляду простої команди UNIX - pwd і з'ясуємо до кінця, що робить дана команда. Необхідно запустити xterm, щоб створити контрольоване оточення для експериментів та набрати наступну команду:

pwd показує поточний робочий каталог. Висновок (команди) на моєму комп'ютері на той момент був таким:

Таким чином, проста функція спростовує складність програми (до речі, так роблять всі комп'ютерні програми). Щоб отримати повне уявлення про всю складність, необхідно запустити команду pwd заново, використовуючи утиліту strace:

За допомогою цієї команди можна побачити, скільки всього відбувається на UNIX-машині тільки для того, щоб виявити та вивести поточнийробочий каталог користувача (листинг 1).

Лістинг 1. Консольний висновок команди strace pwd

Основи системних викликів UNIX

Вдаватися в деталі того, чому всі ці системні виклики необхідні для отримання та виведення на екран поточного робочого каталогу, ми не будемо, оскільки це виходить за межі цієї статті, але я покажу, як отримати цю інформацію. У кожному рядку лістингу 1 - системний виклик з параметрами виводиться в Сі-подібному форматі, саме так, як цього очікують Си-програмісти. strace завжди відображає дзвінки таким чином, незалежно від фактичної мови програмування, яка використовується під час написання програми.

Якщо потрібно зрозуміти всі деталі виведення лістингу 1, UNIX надає величезну кількість документації на всі системні виклики. Найважливіша функція там – це функція getcwd() , яка дозволяє отримати поточний робочий каталог. У поточному xterm показується висновок strace pwd , тому можна запустити ще один xterm і набрати таку саму команду, щоб побачити, що UNIX виведе для цієї функції:

Повинний бути виведений повний лістинг функції getcwd() і лістинг аргументів, які ця важлива функція приймає і повертає. Аналогічно, можна набрати man brk або man fstat64 і таке інше. Ці системні функції зазвичай добре документовані, і якщо згаяти час на їх вивчення, прийде розуміння реальної потужності UNIX і того, як просто проводити низькорівневий аналіз системи. З усіх операційних систем UNIX є найкращою з погляду розуміння того, що відбувається всередині та поза системою.

Огляд nweb

Далі знадобиться щось більше і складніше, ніж проста UNIX-команда типу pwd. Простий сервер Hypertext Transfer Protocol (HTTP), такий як nweb, чудово підійде. HTTP-сервер слухає запити Web-браузера, коли ви бороздите Інтернет, і відправляє за цими запитами об'єкти, що запитуються, такі як Web-сторінки і графічні файли.

Після завантаження архіву es-nweb.zip у папку $HOME/downloads необхідно набрати прості команди, які виконують вилучення, компіляцію та запуск програми (листинг 2):

Зауваження. Передбачається, що програма компілюватиметься на робочій станції з Linux®. Якщо це не так, необхідно прочитати довідку nweb'а про деталі компілювання програми для інших варіантів UNIX.

Лістинг 2. Команди вилучення, компіляції та запуску nweb

Зауваження. Опція -ggdb у лістингу 2 відрізняється від статті Нігеля і дає команду компілятору GCC оптимізувати програму для налагодження у налагоджувачі GDB, який буде використовуватись пізніше.

Далі потрібно перевірити, чи nweb-сервер запущено, використовуючи команду ps для відображення результатів перевірки (листинг 3).

Лістинг 3. Команда ps

Використання strace з nweb

Настав час розпочати дослідження. Запустимо ще один xterm та скористаємося strace для трасування запущеного nweb-сервера. Для того, щоб зробити це, потрібно знати ідентифікатор процесу програми та мати відповідні права доступу. Розглянемо лише певні системні виклики - ті, які мають відношення до мережі. Спочатку необхідно ввести команду, показану в першому рядку лістингу 4, використовуючи ідентифікатор процесу nweb, виведений раніше. Має бути показаний наступний висновок - рядок 2 лістингу 4.

Лістинг 4. Запуск трасування nweb'а

Зазначимо, що трасування зупиняється в середині виклику функції accept() . Необхідно кілька разів оновити сторінку http://localhost:9090 у Web-браузері, щоб побачити, що strace відображає кожне оновлення сторінки.Чи не чудово? Ми бачимо низькорівневі мережеві виклики HTTP-сервера nweb, які були викликані Web-браузером. Буквально кажучи, nweb приймає запити Web-браузера.

Можна зупинити трасування мережевих викликів запущеного процесу nweb, натиснувши Ctrl+C, коли поточним є вікно xterm c запущеним 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 functions, проте список функцій може виявитися дуже довгим (листинг 7).

Лістинг 7. Функції, наведені за допомогою команди info functions

Так як програма nweb була скомпільована з опцією -ggdb , то виконуваний файл було включено багато налагоджувальної інформації, що дозволяє відладчику бачити описи функцій, наведених у файлі, як показано в лістингу 7.

Команди list та disassemble

Дві найважливіші команди GDB - це list і disassemble. Погляньмо, як працюють ці команди, на прикладі коду в лістингу 8.

Лістинг 8. Команда list

Як видно, команда list виводить для запущеної програми вихідний код із номерами рядків. Натискання клавіші повернення (показано між рядками 130 та 131) просто продовжує листинг з того місця, де він закінчився. Тепер необхідно набрати команду disassemble, яку можна скоротити до disass (листинг 9).

Лістинг 9. Команда disassemble

Це виводиться код асемблера з функції main. У цьому випадку асемблерний код показує, що запущений код виконується на процесорі Intel Pentium. Код буде виглядати зовсім інакше, якщо його запустити на комп'ютері з іншим типом процесора, наприклад, на комп'ютері з IBM Power PC®.

Спостереження за працюючою програмою

Так як ведеться спостереження за реально запущеною програмою, то можна встановити точки зупинки і побачити, як програма відповідає на запити Web-браузера і передає файли .html та .jpg браузеру на запит. Як це робиться, показано у лістингу 10.

Лістинг 10. Встановлення точок зупинки

У цій точці GDB встановлює лінію розриву, коли сервер nweb приймає запит Web-браузера; відладчик просто показуватиме запити і продовжуватиме обробку без переривання запущеної програми. Необхідно кілька разів оновити сторінку http://localhost:9090/ у Web-браузері, і можна побачити, що відладчик GDB покаже точку зупинки та продовжить роботу.

Лістинг 11. Інформація про точки зупинки відладчика GDB в xterm

Зазначимо, що при виклику завершення налагодження програми відладчиком GDB, сама програма залишається активною в пам'яті. Відразу після завершення налагодження можна оновити сторінку у Web-браузері та побачити, що nweb продовжує працювати. Можна зупинити програму, набравши команду kill 4009 або сторінка зникне після завершення сесії.

Як завжди, можна дізнатися багато про утилітах, таких як strace і GDB з їх man-і info-сторінок. Впевненіше використовуйте утиліти, які надає UNIX!

Дізнайся якнайбільше

Непогано було б знати якнайбільше про комп'ютер, на якому ви працюєте, а ще краще - отримувати задоволення від процесу роботи. UNIX дійсно заохочує огляд та вивчення утиліт, таких як strace та відладчик GDB, також надаючи багато інформації у їхніх man- та info-сторінках. Комп'ютер - це продовження нашого мозку, і чим більше ми про нього знаємо, тим більше користі від нього.

Ресурси для скачування

Схожі теми

Коментарі