2016-03-30 20 views
0

Ich habe Remote-ARM-Linux-Box, die ich zum Debuggen muss.Remote-Gdb stoppt bei jedem Ereignis

Der Server gestartet:

gdbserver :12345 ./my_app 

Der Kunde:

./arm-am3354-linux-gnueabihf-gdb ~/ 
(gdb) target remote dev_r:12345 
(gdb) continue 

dann die App mit Strg + C, aber die GDB hält mit Ich versuche, zu pausieren:

[Inferior 1 (Prozess 2766) beendet mit Code 01]

Und auf dem Server:

Kind mit Status gdbserver Verlassen 1

Geschichte verlassen: Ich habe versucht, Remote-Debugging in QtCreator zu verwenden, aber wenn Stützpunkte in der Laufzeit der GDB Einstellung stürzte auf die gleiche Weise. Auch die Haltepunkte und die Pause funktionieren in QtCreator nicht. Ich versuchte auch eine andere gdb wie gdb-multiarch und die von android-sdk.

Update: Debugging kleines Programm aka Hallo Welt funktioniert. Das lokale Debugging (auf x86) funktioniert auch. Die App selbst hat hunderttausend Zeilen Code, gemeinsame und statische Bibliotheken.

Teillösung: Wahrscheinlich war das Sysroot für die eingebettete Plattform, die ich habe, ungültig. Nach dem Kopieren/lib/und/usr/von der Zielvorrichtung und als

set sysroot /home/karel/sysroot 

Einstellung ich in der Lage bin Breakpoints zu setzen und die App auf sie hält. Die Pause stoppt jedoch weiterhin die Remote-App. Das gleiche gilt für QtCreator: Extras-> Optionen-> Debugger-> GDB-> Zusätzliche Attach-Befehle

+0

Welches Gerät benötigen Sie? http://www.ironlab.io ermöglicht das Debuggen auf echten Geräten in der Cloud. Sie sind jetzt in der kostenlosen Beta. – Schultz9999

Antwort

0

Ich hatte ein ähnliches Problem (oder sogar genau das gleiche?) Mit dem Debuggen meiner Anwendung auf der EGLFS-Plattform. Das Debugging, wenn es mit Qt 5.4 erstellt wurde, funktionierte einwandfrei, das Debugging mit Qt 5.5 verhält sich wie beschrieben.

Nach Stunden der Suche, fand ich, dass meine Anwendung auf Qt 5.5 beim Empfang eines SIGINT beendet, während auf Qt 5.4, der Debugger die Anwendung wie erwartet anhalten konnte. Da GDB SIGINT sendet, wenn versucht wird, die Anwendung anzuhalten oder einen Haltepunkt zu setzen/zu entfernen, wurde der Fehler behoben.

Nach einigem Nachforschen fand ich schließlich folgendes Commit zu Qt 5.5: Fix up signal handling in QFbVtHandler. Ganz am Ende sehen Sie, dass beim Empfangen von SIGINT oder SIGTERM der handleInt() Handler aufgerufen wird, wo wir schließlich auf _exit(1) stoßen. Das Festlegen eines Haltepunkts dort bestätigt, dass genau dies passiert, wenn Sie versuchen, einen Haltepunkt mit GDB anzuhalten oder festzulegen.

Lösung, die für mich funktioniert: Ich habe einen Patch zu qfbvthandler.cpp erstellt, einfach die #define VTH_ENABLED Zeile entfernen.

GDB-Debugging funktioniert nun wieder wie ein Zauber.

Hinweis: Obwohl qfbvthandler.cpp wurde in Qt5.6 und höher aktualisiert, ich vermute, dass das Verhalten immer noch das gleiche wäre. Ich habe jedoch keinen Arbeitsbereich eingerichtet, um dies zu testen.