Development:GDB Remote einrichten
Development
- Allgemein
- Neutrino-HD-Entwicklung
- dbox2 Entwicklung
Inhaltsverzeichnis
Build Konfiguration
cdk/configure damit alle Debugsymbole vorhanden sind
--enable-debug make yadd-neutrino gdb gdb-remote
Modifikation der Startscripte
In cdkroot/etc/init.d/start_neutrino vor die Zeile Code:
until neutrino -f -u ; do
folgendes einfügen: Code:
exit 0
Anwenden
weil wir Neutrino manuell starten werden. Yadd booten.
Per Telnet auf die Dbox einloggen, dann: Code:
gdbserver :5555 neutrino
gdb wartet dann auf den connect eines clients: Zitat:
Process neutrino created; pid = 189 Listening on port 5555
Auf dem Client ins Verzeichnis
$prefix/cdk/bin
wechseln und Code:
./powerpc-tuxbox-linux-gnu-gdb ../../cdkroot/bin/neutrino
Dann geht es los: Code:
target remote dboxIP:5555 continue
Wenn Neutrino abgestürzt ist, kann, wie gehabt, mit Code:
bt full
ein backtrace erzeugt werden.
Weblinks
http://forum.tuxbox.org/forum/viewtopic.php?p=366575#p366575
GDB und Coolstream Boxen
Auch für die ARM basierten Boxen von Coolstream ist es möglich, dank dem Buildsystem von Seife, mit dem GDB zu arbeiten. Um den GDB nutzen zu können, muss dieser mit den Targets gdb
und gdb-remote
erstellt werden. Dabei wird für die ARM-Plattform der GDB einmal für die lokale Nutzung (also auf den Coolstreamboxen direkt) und einmal für die Benutzung von Remote aus gebaut. Die dabei entstehenden Pakete gdb*-[VER].opkg
in den /tmp
Ordner der Box kopieren und per opkg-cl install gdb-[VER].opkg gdb-remote-[VER].opkg
dort installieren.
Es wird noch ein dritter GDB gebaut. Dieser bleibt auf dem PC und wird unter host/bin/
abgelegt.
GDB Remote benutzen
Damit der GDB Remote gesteuert werden kann, muss eine funktionierende Netzwerkverbindung zur STB aufgebaut sein!
auf der Setopbox
Auf der Setopbox wird der gdbserver
gestartet. Dieser benötigt als Option die Angabe wohin die Meldungen gegeben werden sollen und das Programm was beobachtet werden soll. Dabei kann das Programm sich an eine PID "anheften". Will man also das neutrino
Binary debuggen, kann man folgenden Aufruf benutzen.
~ # gdbserver --attach :5555 $(pidof neutrino)
Attached; pid = 465
Listening on port 5555
Dies bedeutet nun Folgendes:
Der GDB-Server soll sich an eine PID anhängen (--attach
), die Ausgabe soll ins Netzwerk auf Port 5555 erfolgen, dabei sind alle eingehenden IPs zugelassen. Will man hier den Bereich eingrenzen so setzt man die IP vor die Portangabe. Und der letzte Parameter ermittelt die PID ($(pidof neutrino)
) von Neutrino, damit der GDB sich einklinken kann. Im Beispiel die PID 465.
Statt einer IP und eines Ports kann man auch ein anderes Charakterdevice angeben, z.B. einen weitere serielle Schnittstelle die mit einem USB2COM Adapter erstellt ist. Sieht dann so aus.
~ # gdbserver --attach /dev/ttyUSB0 $(pidof neutrino)
Attached; pid = 482
Listening on port 5555
Mit dem Absetzen einer dieser Befehle sind keine weiteren Eingaben auf der STB nötig (und auch möglich).
auf dem PC
Auf den PC muss nun der GDB der unter host/bin/
abgelegt wurde gestartet werden.
$ ./host/bin/arm-cx2450x-linux-gnueabi-gdb
GNU gdb (GDB) 7.3
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=arm-cx2450x-linux-gnueabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb)
Als nächstes muss man dem GDB mitteilen wohin er sich verbinden soll, in unserem Fall auf ein entferntes Target mit einer IP. Die Angabe [IP]
muss entsprechend angepasst werden!
(gdb) target remote [IP]:5555
Remote debugging using [IP]:5555
0x30023fd0 in ?? ()
(gdb)
Damit hat man sich erfolgreich mit dem gdbserver
auf der STB verbunden und kann das Debugging starten. Zum Beispiel in dem man sich die aktuelle Konstellation anschaut.
(gdb) show
ada trust-PAD-over-XVS: Whether an optimization trusting PAD types over XVS types is activated is on.
annotate: Annotation_level is 0.
architecture: The target architecture is set automatically (currently arm)
args: Argument list to give program being debugged when it is started is "".
arm abi: The current ARM ABI is "auto" (currently "APCS").
arm apcs32: Usage of ARM 32-bit mode is on.
arm disassembler: The disassembly style is "std".
arm fallback-mode: The current execution mode assumed (when symbols are unavailable) is "auto".
arm force-mode: The current execution mode assumed (even when symbols are available) is "auto".
arm fpu: The current ARM floating point model is "auto" (currently "fpa").
auto-solib-add: Autoloading of shared library symbols is on.
backtrace limit: An upper bound on the number of backtrace levels is unlimited.
backtrace past-entry: Whether backtraces should continue past the entry point of a program is off.
backtrace past-main: Whether backtraces should continue past "main" is off.
breakpoint always-inserted: Always inserted breakpoint mode is auto (currently off).
breakpoint auto-hw: Automatic usage of hardware breakpoints is on.
breakpoint pending: Debuggers behavior regarding pending breakpoints is auto.
c: range: Range checking is "auto; currently off".
type: Type checking is "auto; currently off".
can-use-hw-watchpoints: Debuggers willingness to use watchpoint hardware is 1.
case-sensitive: Case sensitivity in name search is "auto; currently on".
ch: range: Range checking is "auto; currently off".
type: Type checking is "auto; currently off".
charset: The host character set is "auto; currently UTF-8".
The target character set is "auto; currently UTF-8".
The target wide character set is "auto; currently UTF-32".
check range: Range checking is "auto; currently off".
check type: Type checking is "auto; currently off".
circular-trace-buffer: "Target's use of circular trace buffer is off."
coerce-float-to-double: Coercion of floats to doubles when calling functions is on.
complaints: Max number of complaints about incorrect symbols is 0.
confirm: Whether to confirm potentially dangerous operations is on.
convenience: $_thread = 1
$_siginfo = {si_signo = 19, si_errno = 0, si_code = 0, _sifields = {_pad = {0, 0, 0, 801230848, 4097, 801235004, 801235004, 23, 4104, 2127195252, 800465720, 58, -509579264,
253512, 801148404, 126, 801231416, 152, 801230848, 129, 17, 801230096, 152, 17, 258320, -1, 0, 801230848, 129}, _kill = {si_pid = 0, si_uid = 0}, _timer = {si_tid = 0,
si_overrun = 0, si_sigval = {sival_int = 0, sival_ptr = 0x0}}, _rt = {si_pid = 0, si_uid = 0, si_sigval = {sival_int = 0, sival_ptr = 0x0}}, _sigchld = {si_pid = 0,
si_uid = 0, si_status = 0, si_utime = 801230848, si_stime = 4097}, _sigfault = {si_addr = 0x0}, _sigpoll = {si_band = 0, si_fd = 0}}}
$_sdata = void
cp-abi: The currently selected C++ ABI is "auto" (currently "gnu-v2").
...
(gdb)
GDB lokal auf der STB benutzen
Das direkte Arbeiten mit dem GDB auf der STB hat den Vorteil, das man nicht unbedingt ein funktionierendes Netzwerk besitzen muss. Es reicht, wenn man sich auf einer seriellen Konsole einloggen kann. Dies kann aber auch ein Nachteil sein, wenn man z.B. auf Grund des Debugging neu kompilierte Software testen will oder muss.
Der lokale GDB Debugger lässt sich einfach durch Eingabe von gdb
starten. Damit gelangt man auf die Bedienkonsole des GDB.
~ # gdb
GNU gdb (GDB) 7.3
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "arm-cx2450x-linux-gnueabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb)
Allerdings muss man nun den GDB sagen, was er überhaupt machen soll. Zum Beispiel sich in Neutrino einhängen. Dazu muss zuvor die PID in Erfahrung gebracht werden, mit der |Neutrino auf der STB läuft. Im folgenden hat |Neutrino die PID 465.
(gdb) attach 465
Attaching to process 465
Reading symbols from /bin/neutrino...(no debugging symbols found)...done.
Reading symbols from /lib/libcurl.so.4...(no debugging symbols found)...done.
Loaded symbols for /lib/libcurl.so.4
Reading symbols from /lib/libfreetype.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libfreetype.so.6
Reading symbols from /lib/libpng12.so.0...(no debugging symbols found)...done.
Loaded symbols for /lib/libpng12.so.0
Reading symbols from /lib/libmad.so.0...(no debugging symbols found)...done.
...
[New Thread 0x43a86490 (LWP 487)]
[New Thread 0x43286490 (LWP 486)]
[New Thread 0x42a86490 (LWP 485)]
[New Thread 0x42286490 (LWP 484)]
[New Thread 0x41a86490 (LWP 483)]
...
Reading symbols from /lib/libavcodec.so.52...(no debugging symbols found)...done.
Loaded symbols for /lib/libavcodec.so.52
Reading symbols from /lib/ld-linux.so.3...done.
Loaded symbols for /lib/ld-linux.so.3
0x30023fd0 in select () from /lib/libc.so.6
(gdb)
Der GDB lässt sich aber auch direkt so starten, das dieser die PID mitgeteilt bekommt.
~ # gdb --pid $(pidof neutrino)
GNU gdb (GDB) 7.3
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "arm-cx2450x-linux-gnueabi".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Attaching to process 465
...
(gdb)
GDB beenden
Der GDB lässt sich mit der Eingabe q
und anschließenden Bestätigen mit q
beenden.
(gdb) q
A debugging session is active.
Inferior 1 [process 465] will be detached.
Quit anyway? (y or n) y
Detaching from program: /bin/neutrino, process 465