Development:GDB Remote einrichten

Aus TuxBoxWIKI
Version vom 18. September 2011, 09:11 Uhr von Dbt (Diskussion | Beiträge) (Formatierungen, Links angepasst)
Wechseln zu: Navigation, Suche

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 |CS Entwicklungsumgebung, 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)