Способы отладки 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

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

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

  1. Truly lots of very good advice..
    [url=https://viagrage.com]viagra without a doctor's prescription[/url] viagra online pharmacy http://viagrage.com

  2. Generic
    cialis miami [url=https://cciialiss.com/]buy cialis in australia[/url] buy cialis online us

  3. Brand
    original use cialis [url=https://cciialiss.com/]cialis generic free shipping[/url] buying cialis in malaysia

  4. Generic
    buying cialis over internet [url=https://cciialiss.com/]buy cialis canada[/url] tadalafil dose

  5. Brand
    order cialis net [url=https://cciialiss.com/#]www cciialiss[/url] best online generic cialis

  6. Generic
    cialis effects on heart [url=https://cciialiss.com/]cialis over night delivery[/url] drinking excess cialis

  7. riesgos de tomar viagra buybuyviamen.com kann man in holland viagra rezeptfrei kaufen

  8. youtube good morning viagra last longer on viagra quanto tempo demora para o viagra funcionar

  9. viagra kopi prescribing information of viagra what is viagra and what does it do

  10. en ucuz cialis 100 mg
    made in england viagra
    secure tabs generic viagra DIT pruMn

  11. viagra australia paypal viagra online ireland viagra super force review

  12. advice generic viagra https://paradiseviagira.com average age for viagra

  13. can you buy viagra in cyprus https://purevigra.com can i take half a pill of viagra

  14. generic cialis problems [url=https://ccialisny.com/]mail order and cialis[/url] cialis cost with insurance

  15. buy cialis in miami: buy cialis with paypal buy cialis philippines
    find cheap cialis online

  16. review viagra vs cialis cialis jelly cialis kargo

  17. use levitra [url=http://levitrair.com/]vardenafil[/url]
    levitra 20 mg cost https://levitrair.com

  18. buy doxycycline hyclate 100mg without a rx: doxycycline hyclate 100 mg - vibramycin 100 mg

  19. using klonopin for alcohol detox symptoms of klonopin toxicity klonopin ask patient

  20. mixing neurontin and klonopin does klonopin last longer than xanax xanax versus klonopin

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

*

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

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

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

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