С.В. Герасимов, И.В. Машечкин, М.И. Петровский и др. - Инструментальные средства разработки ПО в ОС UNIX, страница 4
Описание файла
PDF-файл из архива "С.В. Герасимов, И.В. Машечкин, М.И. Петровский и др. - Инструментальные средства разработки ПО в ОС UNIX", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 4 страницы из PDF
В этих случаях можноподключиться к работающей программе отладчиком. Отладчик GDBв этом случае запускается с двумя аргументами: первый — это имяисполняемого файла, второй аргумент — число – идентификаторпроцесса (PID). Примерный сценарий работы с отладчикомприведен ниже.$ gdb ./ej-users 7096программа называется ej-users иработает как процесс 7096GNU gdb (GDB) Fedora (7.2-51.fc14)Copyright (C) 2010 Free Software Foundation, Inc.18License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>This is free software: you are free to change andredistribute it.There is NO WARRANTY, to the extent permitted by law.Type "show copying"and "show warranty" for details.This GDB was configured as "i686-redhat-linux-gnu".For bug reporting instructions, please see:<http://www.gnu.org/software/gdb/bugs/>...Reading symbols from /home/cher/ejudge/ej-users...done.Attaching to program: /home/cher/ejudge/ej-users, process70960xb78c1424 in __kernel_vsyscall ()выполнениепрограммы приостановлено в этой точке(gdb) btпечатаем стек вызовов функций#0 0xb78c1424 in __kernel_vsyscall ()#1 0x00a8788d in ___newselect_nocancel ()at ../sysdeps/unix/syscall-template.S:82#2 0x0806e502 in do_work () at userlist-server.c:10244#3 0x0806fee5 in main (argc=5, argv=0xbfb06754) atuserlist-server.c:10816(gdb) up 2поднимаемся на два уровня вверх постеку вызовов#2 0x0806e502 in do_work () at userlist-server.c:1024410244val = select(max_fd, &rset, &wset, NULL,&timeout);(gdb) p max_fdпечатаем значение переменной max_fd$1 = 7значение переменной равно 7(gdb) quitзавершаем отладкуA debugging session is active.Inferior 1 [process 7096] will be detached.Quit anyway? (y or n) yподтверждаем завершениеотладки, программа продолжит выполнениеDetaching from program: /home/cher/ejudge/ej-users,process 7096$«Посмертная» отладкаПосле аварийного завершения программы, например, врезультате попытки доступа к области памяти, не принадлежащейпроцессу, либо при делении на 0, либо при вызове функции abort(),19еще остается возможность узнать состояние, в котором находиласьпрограмма в момент ошибки.Для этого при аварийном завершении программы ядром ОСдолжен быть сгенерирован файл дампа памяти аварийнозавершившейся программы (так называемый core-файл).
Созданиеcore-файлов может быть по умолчанию отключено. Например,$ ./progHello, I'm Eddie!Abortedзавершилось, но core-файла нет$запускаем программувыполнение программы аварийноДля того, чтобы разрешить создание core-файлов нужно снятьограничение на максимальный размер core-файлов.$ ulimit -c unlimitedТогда работа программы может выглядеть примерно так:$ ./progHello, I'm Eddie!Aborted (core dumped)$ lsкаталогеcore.7911 prog prog.c$запускаем программусмотрим список файлов в текущемпоявился core-файл core.7911В данном примере имя core-файла включает в себя PIDпроцесса, при завершении которого был создан core-файл, но иногдатакой файл называется просто core.Для посмертной отладки GDB запускается с двумяаргументами: первый — это имя исполняемого файла, а второй —это имя core-файла.
Примерный сценарий работы с отладчиком вэтом случае приведен ниже.$ gdb ./prog core.7911запускаем посмертную отладкуGNU gdb (GDB) Fedora (7.2-51.fc14)Copyright (C) 2010 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>This is free software: you are free to change andredistribute it.20There is NO WARRANTY, to the extent permitted by law.Type "show copying"and "show warranty" for details.This GDB was configured as "i686-redhat-linux-gnu".For bug reporting instructions, please see:<http://www.gnu.org/software/gdb/bugs/>...Reading symbols from /home/cher/gdb/prog...done.[New Thread 7911]Core was generated by `./prog'.Program terminated with signal 6, Aborted.#0 0xb782a424 in __kernel_vsyscall ()(gdb) btпросматриваем стек вызовов#0 0xb782a424 in __kernel_vsyscall ()#1 0x009e32f1 in raise (sig=6) at../nptl/sysdeps/unix/sysv/linux/raise.c:64#2 0x009e4d5e in abort () at abort.c:92#3 0x080483fe in main () at prog.c:6(gdb) quitзавершаем отладку$Основные команды отладчикаНиже описываются основные команды отладчика GDB.Команды вводятся с консоли после отображения отладчиком “(gdb)”– строки-приглашения ко вводу очередной команды.quit – завершение работы отладчика.
Если программазапускалась из-под отладчика (первый способ отладки), то вместе сзавершением отладки завершится и программа. Если отладчикподключался к работающей программе, то программа продолжитвыполнение в обычном режиме. Если отладчик запускался дляисследования core-файла, то отладчик просто завершается, так какникакого отлаживаемого процесса не существует. Вместо наборакоманды quit можно просто нажать комбинацию Ctrl-D –стандартная комбинация, обозначающая признак конца файла(конец ввода) в Unux.run – запустить программу на выполнение. Команда доступнатолько, если программа еще не запущена.
При подключении кработающему процессу или исследовании core-файлов даннаякоманда не доступна. Допускается указывать аргументы команднойстроки и перенаправление потоков ввода-вывода, как если быпрограмма запускалась командным процессором. Пример:21(gdb) run < 001.in > 001.outЗдесь программа запускается на выполнение с файлом 001.in,перенаправленным на стандартный поток ввода, и файлом 001.out, вкоторый перенаправляется вывод на стандартный поток вывода.Выполнение программы может быть прервано в любой моментнажатием на комбинацию Ctrl-C. Отладчик приостановитвыполнение программы и выдаст приглашение ко вводу очереднойкоманды отладчика.Выполнение программы также приостанавливается приполучении программой любого сигнала, при завершении программылибо достижении точки останова.bt (или backtrace) – распечатать стек вызовов.
Стек вызововпечатается от самой вложенной функции к функции main. Длякаждого стекового фрейма печатается адрес в коде точки вызова,название функции и параметры, переданные в функцию, а такжепозиция в исходном коде. Команда bt full дополнительно печатаетзначения локальных переменных.(gdb) bt full#0 0xb78c1424 in __kernel_vsyscall ()No symbol table info available.#1 0x00a8788d in ___newselect_nocancel ()at ../sysdeps/unix/syscall-template.S:82No locals.#2 0x0806e502 in do_work () at userlist-server.c:10244addr = {sun_family = 1,sun_path = "\000\060\060\060\071b", '\000'<repeats 101 times>}val = 0max_fd = 7timeout = {tv_sec = 0, tv_usec = 702429}rset = {fds_bits = {80, 0 <repeats 31 times>}}wset = {fds_bits = {0 <repeats 32 times>}}p = 0x0q = 0x9286e68saved_fd = 6up – переход на указанное количество фреймов вверх по стекувызовов функций.
Если аргумент у команды не указан, он22принимается равным 1 (переход на один фрейм вверх, то естьпереход к функции, которая вызвала текущую функцию).down – переход на указанное количество фреймов вниз постеку вызовов функций. Если аргумент у команды не указан, онпринимается равным 1 (переход на один фрейм вниз, то есть переходк функции, которая была вызвана в текущей точке текущейфункции).info frame – получить информацию о текущем стековомфрейме.info locals – получить информацию о значениях локальныхпеременных текущего стекового фрейма.p (или print) – напечатать значение выражения.
Аргументомкоманды может быть почти произвольное выражение языка Си, дажевключающее в себя вызовы функций программы, если, конечно,отлаживаемый процесс существует. Таким образом, вызовыфункций недоступны при «посмертной» отладке. Если аргументкоманды не указан, берется аргумент, который был указан в командеp в последний раз.(gdb) p userпечатаем значение переменной user$1 = (const unsigned char *) 0x0(gdb) pеще раз печатаем значение переменной user$2 = (const unsigned char *) 0x0(gdb)l (или list) – напечатать исходный код. Команду можноиспользовать во многих вариантах, часть из которых перечисленаниже.(gdb)(gdb)(gdb)файла(gdb)(gdb)(gdb)ll l 200напечатать очередные 10 строк исходного файланапечатать предыдущие 10 строк исходного файланапечатать 10 строк в окрестности 200 строки текущегоl prog.c:200l mainl *0x0806e502напечатать 10 строк в окрестности 200 строки файла prog.cнапечатать 10 строк в окрестности начала функции mainнапечатать 10 строк в окрестности кода по указанному адресуb (или break) – установка точки останова.
Параметромкоманды является точка в программе, помечаемая как точкаостанова. Команду можно использовать во многих вариантах, частьиз которых перечислена ниже.23(gdb)(gdb)(gdb)(gdb)bbbbmain200prog.c:200*0x0806e502установить точку останова в начале функции mainустановить точку останова на 200 строке текущего файлаустановить точку останова на 200 строке файла prog.cустановить точку останова по указанному адресуc (или continue) – продолжить выполнение программы.finish — продолжить выполнение программы до достиженияконца текущей функцииn (или next) — сделать указанное количество шаговвыполнения (по умолчанию 1).