Perintah set follow-fork-mode

Kontrol perilaku GDB ketika program yang sedang di-debug memanggil fork() atau vfork().

Sintaksis

set follow-fork-mode parent
set follow-fork-mode child
show follow-fork-mode

Mode

parent
Dalam mode ini, GDB akan terus meng-debug proses induk jika fork() atau vfork() dipanggil. Ini adalah mode default.
child
Dalam mode ini, GDB akan beralih ke proses anak jika fork() atau vfork() dipanggil.

Mode Default

Nilai default untuk pengaturan follow-fork-mode adalah 'parent'.

Catatan

Jika Anda telah mengatur detach-on-fork ke on, GDB akan meng-debug baik proses induk maupun anak. Gunakan perintah info inferiors untuk menampilkan detail dan perintah inferior untuk beralih di antara keduanya.

Contoh

Pada contoh ini, kita akan mendebag program C++ berikut:

                        
#include 
#include 
#include 

void func(int pid, int ret)
{
    printf("My PID is %d, fork() returned %d\n", pid, ret);

    if (ret)
        printf("Kita berada dalam proses induk\n");
    else
        printf("Kita berada dalam proses anak\n");
}

int main()
{
    int r = fork();
    func(getpid(), r);
    return 0;
}
                        
                    

Pertama, kita akan mendebag program dengan pengaturan default untuk follow-fork-mode:

                        
(gdb) break main
Breakpoint 1 at 0x804848f: file forktest.cpp, line 17.
(gdb) run
Starting program: /home/testuser/forktest

Breakpoint 1, main () at forktest.cpp:17
17     int r = fork();
(gdb) show follow-fork-mode
Debugger response to a program call of fork or vfork is "parent".
(gdb) break func
Breakpoint 2 at 0x804844a: file forktest.cpp, line 7.
(gdb) continue
Continuing.

Breakpoint 2, func (pid=7975, ret=7980) at forktest.cpp:7
7     printf("My PID is %d, fork() returned %d\n", pid, ret);
(gdb)
My PID is 7980, fork() returned 0
Kita berada dalam proses anak
(gdb) continue
Continuing.
My PID is 7975, fork() returned 7980
Kita berada dalam proses induk
[Inferior 1 (process 7975) exited normally]
                        
                    

Karena GDB dikonfigurasi untuk terus meng-debug proses induk, proses anak menghasilkan teks 'Kita berada dalam proses anak' saat GDB berhenti di breakpoint pada proses induk. Ketika kami mengeluarkan perintah continue, proses induk mencetak pesannya dan keluar.

Sekarang kita akan melihat apa yang terjadi ketika GDB dikonfigurasi untuk beralih ke proses anak:

                        
(gdb) break main
Breakpoint 1 at 0x804848f: file forktest.cpp, line 17.
(gdb) run
Starting program: /home/testuser/forktest

Breakpoint 1, main () at forktest.cpp:17
17     int r = fork();
(gdb) set follow-fork-mode child
(gdb) break func
Breakpoint 2 at 0x804844a: file forktest.cpp, line 7.
(gdb) continue
Continuing.
My PID is 8025, fork() returned 8029
Kita berada dalam proses induk [Proses baru 8029]
[Beralih ke proses 8029]

Breakpoint 2, func (pid=8029, ret=0) at forktest.cpp:7
7     printf("My PID is %d, fork() returned %d\n", pid, ret);
(gdb) continue
Continuing.
My PID is 8029, fork() returned 0
Kita berada dalam proses anak
[Inferior 2 (process 8029) exited normally]
                        
                    

Sekarang GDB telah beralih ke proses anak, sementara proses induk tetap berjalan di latar belakang. Nilai ret dalam pesan breakpoint adalah 0, menunjukkan bahwa kita berada dalam proses anak.