Ubuntu Touch-Anwendungen in der Befehlszeile zum GDB-Debuggen ausführen?

Ubuntu Touch-Anwendungen in der Befehlszeile zum GDB-Debuggen ausführen?

Ich habe bereits einige Antworten dazu gesehen, konnte daraus jedoch keine endgültige Antwort ziehen. Daher versuche ich es noch einmal.

Meine Frage lautet im Grunde: Wie kann ich Ubuntu Touch-Anwendungen über die Befehlszeile ausführen – insbesondere, sodass ich sie mit debuggen kann gdb?


Mehr Details:

Erstens bedeutet das, dass ich sie von einer Remote-Shell-Verbindung zu einem (Telefon/Tablet-)Gerät auf einem PC ausführen möchte, entweder von adb shelloder phablet-shell(sieheUbuntu Touch hacken, Teil 5: ADB-Shell vs. Phablet-Shell). Ich habe bereits dieTerminal-App, aber - da man keine richtige (VNC) etablieren kannRemotedesktopverbindung zu einem Ubuntu Touch-System, - es nützt mir wenig, da ich nicht wirklich damit arbeiten kann (habe allerdings noch keine an ein Gerät angeschlossene Bluetooth-Tastatur ausprobiert).

Zweitens möchte ich, wenn möglich, Anwendungen im Vordergrund ausführen. Wenn sie dann von der Terminal-Befehlszeile aufgerufen werden, erwarte ich, dass die Anwendungen ihre Standardausgaben auf das Terminal übertragen. Daher ist die Empfehlung inUbuntu Touch: Wie führe ich eine Ubuntu-Touch-App vom Terminal aus?Ich kann nicht viel verwenden, da (dies ist von einem BQ E5 (Ubuntu 15.04, OTA-10.1)):

phablet@ubuntu-phablet:~$ ubuntu-app-list
ubuntu-system-settings
com.ubuntu.calculator_calculator_2.0.233
phablet@ubuntu-phablet:~$ ubuntu-app-launch com.ubuntu.calculator_calculator_2.0.233
phablet@ubuntu-phablet:~$ 

... es startet die App einfach im Hintergrund und wird sofort beendet. Und AFAICS,webapp-containeröffnet lediglich eine URL im Browser und führt keine beliebigen Anwendungen aus.

Einige der vorinstallierten Anwendungen werden anscheinend von einem Programm ausgeführt qmlscene, wieWie führe ich einfach eine Ubuntu-Touch-App vom Terminal aus aus?Hinweise; aber selbst die dort akzeptierte Antwort ist nicht auf Ubuntu 15.04 Touch in seiner vorliegenden Form anwendbar:

$ /usr/bin/qmlscene \
> --desktop_file_hint=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/applications/ubuntu-clock-app.desktop \
> /usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml
Loading module: 'libubuntu_application_api_touch_mirclient.so.3.0.0'
file:///usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml:22 module "Alarm" is not installed
file:///usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml:20 module "WorldClock" is not installed

... und die Anwendung wird auf dem Gerät kurz nach dem Start beendet. Und unten ist die einzige Befehlszeile, die ich gefunden habe und die auf einem BQ E5 Ubuntu 15.04 funktioniert:

APP_ID=com.ubuntu.clock_clock_3.7.456 \
QML2_IMPORT_PATH=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/lib/arm-linux-gnueabihf \
QML_IMPORT_TRACE=1 \
/usr/bin/qmlscene \
--desktop_file_hint=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/applications/ubuntu-clock-app.desktop \
/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml

Anschließend wird die Anwendung auf dem Telefon gestartet, während auf dem Shell-Terminal Nachrichten ausgegeben werden, wie etwa:

Loading module: 'libubuntu_application_api_touch_mirclient.so.3.0.0'
QQmlImportDatabase::addImportPath: "/usr/lib/arm-linux-gnueabihf/qt5/qml"
QQmlImportDatabase::addImportPath: "/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/lib/arm-linux-gnueabihf"
QQmlImportDatabase::addImportPath: "/usr/lib/arm-linux-gnueabihf/qt5/bin"
...

... und nachdem Sie im Terminal Strg-C gedrückt haben, wird die Anwendung beendet.

Warum mir das gefällt, ist zum einen, dass ich weiß, was der Anwendungsausdruck ist und wie man ihn umleitet/speichert - und zum anderen, dass ich weiß, wie man eine gdbBefehlszeile zum Debuggen erstellt. Ich habe es geschafft, das Gerät in den Schreibmodus zu versetzen, und von der Shell-Installation aus build-essential(sieheEmpfohlene Methode zum Installieren regulärer (CLI) .deb-Pakete auf einem Ubuntu-Telefon?), das einzieht gdb, sodass es jetzt auch im schreibgeschützten Modus in der Shell verfügbar ist. Dann kann ich Folgendes tun:

APP_ID=com.ubuntu.clock_clock_3.7.456 \
QML2_IMPORT_PATH=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/lib/arm-linux-gnueabihf \
QML_IMPORT_TRACE=1 \
gdb --args \
/usr/bin/qmlscene \
--desktop_file_hint=/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/applications/ubuntu-clock-app.desktop \
/usr/share/click/preinstalled/com.ubuntu.clock/3.7.456/share/qml/ubuntu-clock-app.qml

... das sich ordnungsgemäß öffnet gdb:

GNU gdb (Ubuntu 7.9-1ubuntu1) 7.9
...
Type "apropos word" to search for commands related to "word"...
Reading symbols from /usr/bin/qmlscene...(no debugging symbols found)...done.

(ist in diesem Beispiel aber aufgrund fehlender Debugsymbole nicht so nützlich).

qmlsceneAllerdings gibt es neben diesen von ausgeführten Apps anscheinend auch „richtige“ ausführbare Dateien auf Ubuntu Touch 15.03, wie beispielsweise die Browser-App:

phablet@ubuntu-phablet:~$ which webbrowser-app
/usr/bin/webbrowser-app
phablet@ubuntu-phablet:~$ file /usr/bin/webbrowser-app
/usr/bin/webbrowser-app: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c173774045b98a97e831eda92dd5008d08b9a251, stripped

... aber diese Art kann ich einfach nicht über die Befehlszeile ausführen. Am nächsten kam ich (in Analogie zu oben und durch Kopieren einiger Umgebungsvariablen, die envin der Terminal-App auf dem Telefon ausgeführt wurden) diesem:

APP_ID=webbrowser-app \
UNITY_MIR_SOCKET=/run/mir_socket \
MIR_SOCKET=/var/run/mir_socket \
MIR_SERVER_PROMPT_FILE=1 \
MIR_SERVER_NAME=session-0 \
/usr/bin/webbrowser-app \
--desktop_file_hint=/usr/share/applications/webbrowser-app.desktop

... was jedoch im Terminal sofort mit folgendem fehlschlägt:

Loading module: 'libubuntu_application_api_touch_mirclient.so.3.0.0'
UbuntuClientIntegration: connection to Mir server failed. Check that a Mir server is
running, and the correct socket is being used and is accessible. The shell may have
rejected the incoming connection, so check its log file
Aborted

Und außerdem all diese Geschäfte mit--desktop_file_hintscheint etwas zu sein, das von Unity8 benötigt wird (d. h. Unity8 überprüft möglicherweise die Befehlszeile der App und sucht danach, selbst wenn die App selbst es nicht verwendet) – verschwindet aber möglicherweise (oder wird gerade entfernt):

Ubuntu-Bugs – [Bug 1578319] [NEU] Einige AP-Tests des Ubuntu-UI-Toolkits können nicht gestartet werden – werden von Unity8 abgelehnt, da desktop_file_hint verwendet wird (2016-05)

... verwendet upstart-app-launch nicht – was den Fehler erklären würde. desktop_file_hint wird nicht zum Starten einer App unterstützt (und kann jederzeit verschwinden), daher sollte UITK in seinen AP-Tests auf UAL umsteigen.

Dies hat tatsächlich bis vor kurzem funktioniert, aber eine kürzlich erfolgte Umgestaltung hat das Verhalten von desktop_file_hint unterbrochen. Da es sich nicht um ein unterstütztes Verhalten handelt, sollte man sich darauf verlassen. Daher wäre es besser, UITK zu reparieren, als das alte Verhalten wiederherzustellen.

Ok, aber wie führe ich dann ausführbare Dateien aus, möglicherweise von nicht installierten Anwendungen, mit upstart-app-launch(ie ubuntu-app-launch) aus - und wie würde ich sie im Vordergrund im Terminal ausführen? Ich bin mir bewusst, dass - genau wie Android ndk-gdb- das Ubuntu SDK etwas Ähnliches hatüber Qt Creatorwas anscheinend gdbserverauf dem Gerät verwendet wird. Ich würde es jedoch vorziehen, für so etwas keine GUI zu starten – und würde es tatsächlich gerne gdbauf die altmodische Art und Weise ausführen, wie oben beschrieben, mit einer ausführbaren Datei als Argument in der Befehlszeile.

Ich schätze, das liegt zum großen Teil daran, dass ich die Unterschiede zwischen init/Upstart, X11/Mir, Gnome/Unity usw., die auf einem Gerät im Vergleich zu einem (klassischen) Desktop gelten, nicht ganz verstehe – und ich kann nicht wirklich sagen, was was ausführt. Ich hätte gerne genug Erklärungen, damit ich verstehen kann, wie das Ausführen von (GUI-)Ubuntu-Touch-Apps über eine Terminal-Befehlszeile funktionieren würde.

Antwort1

Nun, ich glaube, ich habe etwas gefunden, das einige der Dinge erklärt, über die ich nachgedacht habe – aber ich würde mich trotzdem freuen, wenn jemand eine richtige, gelehrte Antwort posten würde, also werde ich diese hier vorerst nicht akzeptieren …

Wie auch immer, die Ressource ist:

Fehler Nr. 1367871 „ubuntu-app-launch übergibt keine Argumente an die ausführbare Datei“: Fehler: Ubuntu Application Launcher
https://bugs.launchpad.net/ubuntu-app-launch/+bug/1367871

UAL ist nicht dafür ausgelegt, benutzerdefinierte Binärdateien nach Belieben auszuführen, sondern Anwendungen zu starten. Eine Anwendung wird mit einer Reihe verschiedener Metadaten definiert, aber eine der wichtigsten ist eine Desktop-Datei. Diese Datei definiert, wie die Anwendung gestartet wird, und UAL entscheidet, wie sie gestartet wird. Auf diese Weise kann die Anwendung auf konsistente Weise gestartet werden und ist von Gerät zu Gerät gleich. [...]

Das Schwierige an der App-Beschränkung ist, dass Befehlszeilenargumente und Umgebungsvariablen dafür keine gute Kombination sind. In der Click-Paketwelt ist eine „App“ vollständig vom Rest des Systems getrennt. Es gibt einige Hooks in Click, um symbolische Links oder Ähnliches einzurichten, damit andere Teile des Systems diese Apps leicht finden können, wie etwa Ubuntu-App-Launch und der Apps-Bereich. Aber es sind keine Befehlszeilen-Anwendungen, und Sie können sie nicht einfach mit beliebiger Konfiguration von der Befehlszeile aus ausführen.

Antwort2

Ich verwende Lubuntu und finde, dass dies von einer Remote-Shell aus, die mit ssh -Y user@linuxbox gestartet wird, einwandfrei funktioniert:

ubuntu-app-launch "qterminal"    
qterminal

Der erste startet qterminal in Quartz und muss nicht nach meinem Passwort fragen. Der zweite startet auch qterminal, benötigt aber ein Passwort

Ich glaube, das erste führt auch Bash aus. Haben Sie versucht, es auszuführen lxsession? Obwohl es unbrauchbar ist, bekomme ich diesen seltsamen neuen Papierkorb und das Unity-Linux-Installationsprogramm erscheint seltsam.

Bildbeschreibung hier eingeben

verwandte Informationen