Perintah set sysroot

Menentukan direktori lokal yang berisi salinan pustaka target dalam subdirektori yang sesuai. Opsi ini berguna saat debugging dengan gdbserver.

Sintaksis

set sysroot [Direktori]
set sysroot remote:/
set sysroot remote:[Direktori Remote]
set solib-absolute-prefix [Direktori]
show sysroot

Parameter

Direktori
Menentukan direktori lokal yang berisi pustaka target dalam subdirektori yang sesuai dengan jalur target. Misalnya, jika Anda mengatur ini ke c:\sysroot, GDB akan mengharapkan menemukan salinan /lib/ld-linux.so di c:\sysroot\lib\ld-linux.so.
Direktori Remote
Menentukan direktori di mesin remote yang berisi pustaka-pustaka tersebut. Biasanya Direktori Remote seharusnya hanya '/'.

Penggunaan Tipe

Perintah ini berguna saat debugging program jarak jauh menggunakan gdbserver dan pustaka-pustaka di mesin target (yang menjalankan gdbserver) tidak sesuai dengan pustaka-pustaka di mesin sumber (yang menjalankan gdb). Untuk mengatur breakpoint dan menemukan baris kode yang sesuai dengan lokasi kode yang berbeda, GDB perlu mengakses file-file pustaka yang berisi informasi simbol. Dengan menyalin pustaka-pustaka tersebut ke lokasi di bawah direktori lokal dan menentukan jalurnya melalui set sysroot, GDB dapat menemukannya.

Nilai Default

Nilai default untuk variabel set sysroot tergantung pada toolchain Anda. Jika binary GDB Anda dikompilasi dengan argumen --sysroot, Anda tidak perlu menjalankan perintah set sysroot - sysroot akan secara otomatis diatur ke lokasi yang ditentukan selama kompilasi. Jika tidak, nilai defaultnya akan "" dan Anda mungkin perlu mengaturnya secara manual jika Anda sedang debugging proses remote.

Contoh

Pada contoh ini, kita akan melakukan debugging sebuah shared library dengan gdbserver:

                        
#include 

int func()
{
    printf("Di dalam func()\n");
    return 0;
}
                        
                    

Kita akan menggunakan program sederhana untuk menguji library kita:

                        
#include 

int func();

int main()
{
    printf("Di dalam main()\n");
    func();
    return 0;
}
                        
                    

Pertama, kita membangun aplikasi dan library dan mendeploynya ke mesin lain:

                        
cd /home/testuser/libtest
g++ -ggdb -fPIC -shared lib.cpp -o libTest.so
g++ -ggdb main.cpp libTest.so -o testApp -Wl,--rpath='$ORIGIN'
scp testApp libTest.so deploy_machine:/tmp
                        
                    

Kedua, kita membuat direktori sysroot lokal yang akan berisi salinan pustaka sistem dari mesin target:

                        
mkdir /home/testuser/libtest/sysroot
cd /home/testuser/libtest/sysroot
scp -r deploy_machine:/lib lib
                        
                    

Ketiga, kita memindahkan pustaka libTest.so ke direktori dalam sysroot yang sesuai dengan /tmp di mesin target (tempat kami mendeploy library kami):

                        
mkdir tmp
mv ../libTest.so tmp
                        
                    

Lalu kita jalankan gdbserver di mesin deploy_machine:

                        
cd /tmp
gdbserver :2000 testApp
                        
                    

Terakhir, kita jalankan GDB:

                        
cd /home/testuser/libtest
gdb testApp
                        
                    

Perhatikan bagaimana setelah kita mengeluarkan perintah set sysroot, GDB akan membaca semua simbol dari DLL yang disalin di dalam /home/testuser/libtest/sysroot.

                        
GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
Ini adalah perangkat lunak bebas: Anda dapat mengubah dan mendistribusikannya.
TIDAK ADA JAMINAN, sejauh yang diizinkan oleh hukum. Ketik "show copying"
dan "show warranty" untuk detailnya.
GDB ini dikonfigurasi sebagai "i686-linux-gnu".
Untuk instruksi pelaporan bug, silakan lihat:


Reading symbols from /home/testuser/libtest/testApp...done.
(gdb) set sysroot /home/testuser/libtest/sysroot
(gdb) break main
Breakpoint 1 at 0x80484ed: file main.cpp, line 13.
(gdb) target remote deploy_host:2000
Remote debugging using deploy_host:2000
Reading symbols from /home/testuser/libtest/sysroot/lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for /home/testuser/libtest/sysroot/lib/ld-linux.so.2
0x0012d0e0 in ?? () from /home/testuser/libtest/sysroot/lib/ld-linux.so.2
(gdb) continue
Continuing.
Breakpoint 1, main () at main.cpp:13
13   printf("Di dalam main()\n");
(gdb) info shared
From        To          Syms Read   Shared Object Library
0x0012c830  0x001435cf  Yes (*)     /home/testuser/libtest/sysroot/lib/ld-linux.so.2
0x009563a0  0x009564c8  Yes         /home/testuser/libtest/sysroot/tmp/libTest.so
0x007ecbe0  0x008f9784  Yes (*)     /home/testuser/libtest/sysroot/lib/i386-linux-gnu/libc.so.6
(*): Shared library is missing debugging information.
(gdb) break func
Breakpoint 2 at 0x95646e: file lib.cpp, line 9.
(gdb) continue
Continuing.
Breakpoint 2, func () at lib.cpp:9
9   printf("Di dalam func()\n");
(gdb) continue
Continuing.
[Inferior 1 (process 11111) exited normally]
(gdb) quit
                        
                    

Kita juga bisa menghindari penyalinan pustaka secara manual. Jika Anda menentukan remote:/ sebagai sysroot, GDB akan mengunduh pustaka secara otomotis:

    
GNU gdb (Ubuntu/Linaro 7.4-2012.02-0ubuntu2) 7.4-2012.02
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
Ini adalah perangkat lunak bebas: Anda dapat mengubah dan mendistribusikannya.
TIDAK ADA JAMINAN, sejauh yang diizinkan oleh hukum. Ketik "show copying"
dan "show warranty" untuk detailnya.
GDB ini dikonfigurasi sebagai "i686-linux-gnu".
Untuk instruksi pelaporan bug, silakan lihat:


Reading symbols from /home/testuser/libtest/testApp...done.
(gdb) set sysroot remote:/
(gdb) break main
Breakpoint 1 at 0x80484ed: file main.cpp, line 13.
(gdb) target remote deploy_host:2000
Remote debugging using deploy_host:2000
Reading symbols from remote:/lib/ld-linux.so.2...(no debugging symbols found)...done.
Loaded symbols for remote:/lib/ld-linux.so.2
0x001cb0e0 in ?? () from remote:/lib/ld-linux.so.2
(gdb) continue
Continuing.
Breakpoint 1, main () at main.cpp:13
13   printf("Di dalam main()\n");
(gdb) info shared
From        To          Syms Read   Shared Object Library
0x001ca830  0x001e15cf  Yes (*)     remote:/lib/ld-linux.so.2
0x009d93a0  0x009d94c8  Yes         remote:/tmp/libTest.so
0x004f7be0  0x00604784  Yes (*)     remote:/lib/i386-linux-gnu/libc.so.6
(*): Shared library is missing debugging information.
(gdb) break func
Breakpoint 2 at 0x9d946e: file lib.cpp, line 9.
(gdb) continue
Continuing.
Breakpoint 2, func () at lib.cpp:9
9   printf("Di dalam func()\n");
(gdb) continue
Continuing.
[Inferior 1 (process 11124) exited normally]
(gdb) quit