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