perintah set detach-on-fork

Menentukan apakah GDB harus melakukan debugging pada proses induk dan anak setelah panggilan fork() atau vfork()

Sintaks

set detach-on-fork on
set detach-on-fork off
show detach-on-fork

Mode

on
Dalam mode ini, GDB akan tetap terhubung ke proses induk atau anak (tergantung pada perintah set follow-fork-mode).
off
Dalam mode ini, GDB akan terhubung ke kedua proses setelah panggilan fork() atau vfork(). Gunakan perintah info inferiors untuk menampilkan detail dan perintah inferior untuk beralih di antara keduanya.

Mode Default

Nilai default untuk pengaturan detach-on-fork adalah 'on'.

Catatan

Gunakan perintah set follow-fork-mode untuk mengontrol proses mana yang akan dipilih setelah GDB melanjutkan dari panggilan fork() atau vfork().

Contoh

Pada contoh ini, kita akan melakukan debugging 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("Kami berada di proses induk\n");
    else
        printf("Kami berada di proses anak\n");
}

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

Jika kita debug program dengan pengaturan default untuk detach-on-fork, hanya satu dari kedua proses yang tetap di-debug (dan akan memicu breakpoint). Lihat deskripsi set follow-fork-mode untuk lebih banyak detail.

Jika kita mengatur detach-on-fork ke on, GDB tidak akan melepaskan proses anak dan kita dapat beralih ke proses anak menggunakan perintah inferior:

                        
(gdb) start
Temporary breakpoint 1 at 0x804848f: file forktest.cpp, line 17.
Starting program: /home/testuser/forktest

Temporary 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) set detach-on-fork off
(gdb) break func
Breakpoint 2 at 0x804844a: file forktest.cpp, line 7.
(gdb) continue
Continuing.
[New process 8133]

Breakpoint 2, func (pid=8125, ret=8133) at forktest.cpp:7
7     printf("My PID is %d, fork() returned %d\n", pid, ret);
(gdb) continue
Continuing.
My PID is 8125, fork() returned 8133
Kami berada di proses induk
[Inferior 1 (process 8125) exited normally]
(gdb) info inferiors
  Num  Description       Executable
  2    process 8133      /home/testuser/forktest
* 1                /home/testuser/forktest
(gdb) inferior 2
[Switching to inferior 2 [process 8133] (/home/testuser/forktest)]
[Switching to thread 2 (process 8133)]
#0  0xb7fdd424 in ?? ()
(gdb) bt
#0  0xb7fdd424 in ?? ()
#1  0x08048494 in main () at forktest.cpp:17
(gdb) continue
Continuing.

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

Seperti yang diharapkan, GDB melanjutkan debugging pada proses induk. Proses anak tetap ditangguhkan sampai kita beralih ke proses anak menggunakan perintah inferior dan melanjutkannya dengan menggunakan perintah continue.

Sekarang kita akan mengonfigurasi GDB untuk beralih ke proses anak:

                        
(gdb) set detach-on-fork off
(gdb) set follow-fork-mode child 
(gdb) break func
Breakpoint 1 at 0x804844a: file forktest.cpp, line 7.
(gdb) run
Starting program: /home/testuser/forktest
[New process 8080]
[Switching to process 8080]

Breakpoint 1, func (pid=8080, ret=0) at forktest.cpp:7
7     printf("My PID is %d, fork() returned %d\n", pid, ret);
(gdb) continue
Continuing.
My PID is 8080, fork() returned 0
Kami berada di proses anak
[Inferior 2 (process 8080) exited normally]
(gdb) info inferiors
  Num  Description       Executable
* 2                /home/testuser/forktest
  1    process 8077      /home/testuser/forktest
(gdb) inferior 1
[Switching to inferior 1 [process 8077] (/home/testuser/forktest)]
[Switching to thread 1 (process 8077)]
#0  0xb7fdd424 in __kernel_vsyscall ()
(gdb) bt
#0  0xb7fdd424 in __kernel_vsyscall ()
#1  0xb7ed4f7c in __libc_fork () at ../nptl/sysdeps/unix/sysv/linux/i386/../fork.c:131
#2  0x08048494 in main () at forktest.cpp:17
(gdb) continue
Continuing.

Breakpoint 1, func (pid=8077, ret=8080) at forktest.cpp:7
7     printf("My PID is %d, fork() returned %d\n", pid, ret);
(gdb) continue
Continuing.
My PID is 8077, fork() returned 8080
Kami berada di proses induk
[Inferior 1 (process 8077) exited normally]