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 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