define('DISALLOW_FILE_EDIT', true); define('DISALLOW_FILE_MODS', true); /dev/head — Способы отладки gdb’ом или ddd’ом приложения с fork()

Способы отладки gdb’ом или ddd’ом приложения с fork()

Я разрабатываю клиент серверное приложение на языке программирования C (Си). У меня как и у всех разработчиков возникает необходимость запуска приложения под отладчиком. В однопоточном приложении и приложении с thread'ами (нитями) все достаточно стандартно - просто запускаем его через $ gdb мое_приложение. Но в случае если отладчик наткнется на вызов fork() он переключится на parent (родитель) процесс, хотя обычно, в демонах, после первого fork()'а родитель завершает свою работу и по смылу нужно отлаживать child процесс. Для ddd и gbd можно писать скрипты при помощи которых можно указывать отладчику идти по parent пути или по child, также можно цепляться уже к запущенному и работающему приложению. Сейчас мы и разберем все эти способы отладки.

Отладка с выбором пути следования по вызовам fork()

Первый способ, он описан в документации к gdb. Весь смысл метода в том чтобы описать по какой ветке идти после вызова fork() и скормить это описание отладчику. Вот пример кода для запуска под отладчиком:

#include
#include
#include
#include 

#define I_CHILD 1
#define I_PARENT 2

void dummy_function(int who_i) {
    pid_t pid;
    if (who_i == I_CHILD) {
        printf("Child after first fork() call dummy_function() my pid is %i\n", getpid());
    } else {
        printf("Parent after first fork() call dummy_function() my pid is %i\n", getpid());
    }
    switch (pid = fork()) {
    case -1:
        printf("Second fork() ERROR\n");
        if (errno == ENOMEM) {
            printf("Memory is tight\n");
        }
        exit(-1);
    case 0:
        printf("I'm child after second fork() My pid is %i\n", getpid());
        break;
    default:
        printf("I'm parent after second fork() My pid is %i My child's pid is %i\n", getpid(), pid);
        break;
    }
    printf("PID %i exit\n", getpid());
    exit(0);
}

int main(int argc, char *argv[]) {
    pid_t pid;
    printf("Example started with pid %i\n", getpid());
    printf("Commandline args: ");
    while (--argc > 0) {
        printf("%s ", argv[argc]);
    }
    printf("\n");
    switch (pid = fork()) {
    case -1:
        printf("First fork() ERROR\n");
        if (errno == ENOMEM) {
            printf("Memory is tight\n");
        }
        exit(-1);
    case 0:
        printf("I'm child after first fork() My pid is %i\n", getpid());
        dummy_function(I_CHILD);
    default:
        printf("I'm parent after first fork() My pid is %i My child's pid is %i\n", getpid(), pid);
        dummy_function(I_PARENT);
    }
}

Сохраняем в файл fork.c компилим с ключами: -O0 - отключение оптимизации и -g - для сохранения кода в исполняемый файл (они нужны для отладчика):

$ gcc fork.c -O0 -g

запускаем:

$ ./a.out 1 2 3 4 5 6 7 8 9 10 11 12 13

Получаем что-то вроди этого:

Example started with pid 6990
Commandline args: 13 12 11 10 9 8 7 6 5 4 3 2 1
I'm parent after first fork() My pid is 6990 My child's pid is 6991
Parent after first fork() call dummy_function() my pid is 6990
I'm child after first fork() My pid is 6991
Child after first fork() call dummy_function() my pid is 6991
I'm parent after second fork() My pid is 6990 My child's pid is 6992
PID 6990 exit
I'm parent after second fork() My pid is 6991 My child's pid is 6993
PID 6991 exit
user@server-32:~/sandbox/gdb_fork_example$ I'm child after second fork() My pid is 6993
PID 6993 exit
I'm child after second fork() My pid is 6992
PID 6992 exit

Все программа работает, но вот незадача если мы запустим её под отладчиком то сможем отлаживать лишь самый первый процесс, в предыдущем примере у него был pid 6990. И так приступим

Теги: , , , , ,

Дата: 8 ноября 2012

Автор: andreykyz

Комментарии: 32

Комментарии: 32

  1. Слушайте кто знает Муж просто умирает на глазах Соседи уже вызвали участкового В диспансер тащить — последнее дело Короче, спасла только госпитализация — капельница от запоя в стационаре круглосуточно Капельницы и уколы по схеме В общем, вся инфа по ссылке — вывод из запоя стационарно [url=https://lechenie.vyvod-iz-zapoya-v-stacionare-samara12.ru]вывод из запоя стационарно[/url] Стационар — это единственный выход Перешлите тем кто в беде

  2. Екатеринбург, всем привет Ситуация критическая Дети напуганы Нужна срочная помощь на дому Короче, единственное что вытащило из запоя — поставить капельницу от запоя на дому цена выгодная Через пару часов человек пришёл в себя В общем, жмите чтобы сохранить — прокапаться от похмелья [url=https://pomosch-alkogolizm.kapelnicza-ot-zapoya-ekaterinburg-nmx.ru]https://pomosch-alkogolizm.kapelnicza-ot-zapoya-ekaterinburg-nmx.ru[/url] Не ждите пока станет хуже Перешлите тем кто в такой же ситуации

  3. Слушайте кто знает Близкий человек уже две недели в запое Родственники в полном отчаянии Платная клиника просит бешеные деньги Короче, врачи стационара реально вытащили — наркология вывод из запоя в стационаре с психологом Врачи и медсёстры 24/7 В общем, вся инфа по ссылке — вывести из запоя в стационаре [url=https://narkolog.vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-vby.ru]вывести из запоя в стационаре[/url] Звоните прямо сейчас Это может спасти жизнь

  4. Слушайте, кто реально сталкивался с такой бедой? Близкий человек уже несколько дней находится в тяжелом запое, Дети сильно напуганы происходящим, Никакие народные методы и таблетки из аптеки вообще не помогают до тех пор, не нашли проверенную медицинскую службу, начиная от качественной детоксикации на месте и заканчивая подбором медикаментов. Уже через пару часов человек наконец-то пришёл в себя и уснул,

    В общем, если не хотите рисковать жизнью близкого человека, жмите на источник, чтобы случайно не потерять контакты капельница от алкоголя [url=https://kruglosutochno-chastnyy.kapelnicza-ot-zapoya-ekaterinburg-nmx.ru]капельница от алкоголя[/url] Квалифицированная медицинская помощь на дому — это единственный реальный выход, обязательно перешлите этот пост тем, кто тоже сейчас находится в такой же критической ситуации!

  5. Слушайте кто сталкивался Близкий человек уже 10 дней в запое Родственники в полном отчаянии В диспансер тащить — последнее дело Короче, единственные кто взялся за безнадёжный случай — вывод из запоя стационарно с психологом Выписали через неделю здоровым В общем, вся инфа по ссылке — стационарное выведение из запоя [url=https://lechenie.vyvod-iz-zapoya-v-stacionare-samara.ru]https://lechenie.vyvod-iz-zapoya-v-stacionare-samara.ru[/url] Звоните прямо сейчас Это может спасти жизнь

  6. Слушайте кто сталкивался Брат потерял человеческий облик Жена рыдает Скорая не приедет на такой вызов Короче, спасла только госпитализация — вывод из запоя в наркологическом стационаре с палатой Выписали через неделю здоровым В общем, телефон и цены тут — капельница от запоя в стационаре [url=https://kodirovanie.vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-xft.ru]капельница от запоя в стационаре[/url] Стационар — это единственный выход Это может спасти жизнь

  7. Слушайте кто сталкивался Близкий человек уже 10 дней в запое Дети боятся заходить в комнату Платная клиника просит бешеные деньги Короче, врачи стационара реально вытащили — цена вывода из запоя в стационаре доступная Врачи и медсёстры 24/7 В общем, жмите чтобы сохранить — запой стационар анонимно [url=https://kapelnicza.vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-jkp.ru]https://kapelnicza.vyvod-iz-zapoya-v-staczionare-nizhnij-novgorod-jkp.ru[/url] Звоните прямо сейчас Перешлите тем кто в беде

  8. Строители отзовитесь Объездил кучу заводов — везде перекупы То вообще машина не приезжает Короче, реальное производство в Москве — бетонные кольца для колодцев Цены ниже чем у перекупов на 20% В общем, там каталог и цены — дорожная плита [url=https://probetonzavod.ru]дорожная плита[/url] Проверяйте производителя по документам Перешлите тому кто строит

  9. Народ всем привет Задолбался я уже забор искать То вообще приезжают и говорят что замер не тот Короче, нашел нормальных ребят — заборы под ключ в Москве с гарантией И установили всё чисто В общем, там каталог и цены — забор ранчо под ключ [url=https://zagorodnii-dom.ru]забор ранчо под ключ[/url] Не ведитесь на дешёвые предложения Перешлите тому у кого участок

  10. Слушайте кто хочет удивить Задолбался я уже искать нормальные подарки Либо дорого, либо не то Короче, большой выбор и низкие цены — магазин эксклюзивных товаров с индивидуальным подходом Доставка по Москве и области В общем, жмите чтобы не потерять — самые дорогие подарки [url=https://boutique-guide.ru]самые дорогие подарки[/url] Не переплачивайте в обычных магазинах Перешлите тому кто ищет подарки

  11. Воронеж, всем привет Отец не выходит из штопора Дети напуганы В больницу тащить страшно Короче, только это реально спасло — нарколог на дом круглосуточно цены доступные Приехал через 40 минут В общем, не потеряйте контакты — нарколог на дом цена воронеж [url=https://kapelnicza.narkolog-na-dom-voronezh-12.ru]https://kapelnicza.narkolog-na-dom-voronezh-12.ru[/url] Звоните прямо сейчас Перешлите тем кто в такой же ситуации

  12. Здорова, народ Ситуация критическая Жена в истерике Таблетки не помогают Короче, единственный кто реально помог — вызвать нарколога на дом быстро Через пару часов человек пришёл в себя В общем, телефон и цены тут — вызвать врача нарколога [url=https://zapoj.narkolog-na-dom-voronezh-11.ru]https://zapoj.narkolog-na-dom-voronezh-11.ru[/url] Звоните прямо сейчас Перешлите тем кто в такой же ситуации

Оставить комментарий

*

Комментарий:

Ваш e-mail не будет опубликован.
Обязательные поля помечены *

Разрешенные HTML теги:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>