이와 관련된 답변을 이미 보았는데, 확실한 답변이 나오지 않아서 다시 시도해 보겠습니다.
기본적으로 내 질문은 다음과 같습니다. 명령줄에서 Ubuntu Touch 응용 프로그램을 어떻게 실행하여 디버깅할 수 있습니까 gdb
?
자세한 내용은:
adb shell
첫째, 이것이 의미하는 바는 PC의 (전화/태블릿) 장치에 대한 원격 셸 연결에서 또는 ( phablet-shell
참조) 실행하고 싶다는 것입니다.Ubuntu Touch 해킹, 5부: adb 쉘과 패블릿 쉘 비교). 나는 이미 그것을 얻었다터미널 앱, 그러나 - 적절한 (VNC)를 설정할 수 없다는 점을 고려하면Ubuntu Touch 시스템에 대한 원격 데스크톱 연결, - 실제로 작업할 수 없기 때문에 나에게는 거의 쓸모가 없습니다(아직 장치에 연결된 Bluetooth 키보드를 사용해 본 적은 없습니다).
둘째, 가능하다면 애플리케이션을 포그라운드에서 실행하고 싶습니다. 그런 다음 터미널 명령줄에서 호출하면 응용 프로그램이 표준 출력 출력을 터미널에 덤프할 것으로 예상됩니다. 따라서,Ubuntu Touch: 터미널에서 Ubuntu Touch 앱을 어떻게 실행합니까?다음과 같은 이유로 많이 사용할 수 없습니다(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:~$
... 단순히 백그라운드에서 앱을 실행하고 즉시 종료됩니다. 그리고 AFAICS,webapp-container
단순히 브라우저에서 URL을 열 뿐 임의의 애플리케이션을 실행하지는 않습니다.
qmlscene
사전 설치된 응용 프로그램 중 일부는 다음과 같이 프로그램에 의해 실행되는 것으로 보입니다 .터미널에서 우분투 터치 앱을 어떻게 실행하나요?노트; 그러나 허용되는 답변조차도 Ubuntu 15.04 Touch에는 그대로 적용되지 않습니다.
$ /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
...애플리케이션이 시작된 후 거의 장치에서 종료됩니다. 다음은 BQ E5 Ubuntu 15.04에서 작동하는 것으로 확인된 유일한 명령줄입니다.
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
그러면 애플리케이션이 전화에서 시작되고 쉘에서는 다음과 같은 터미널 메시지가 덤프됩니다.
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"
...
... 터미널에서 Ctrl-C를 누르면 애플리케이션이 종료됩니다.
gdb
내가 이것을 좋아하는 이유는 하나는 응용 프로그램 인쇄물이 무엇인지, 어떻게 리디렉션/저장하는지 알고 있고, 다른 하나는 디버깅을 위해 명령줄을 작성하는 방법을 알고 있기 때문입니다 . 장치를 쓰기 가능 모드로 설정하고 쉘 설치에서 관리했습니다 build-essential
(참조Ubuntu Phone에 일반(cli) .deb 패키지를 설치하는 데 권장되는 방법은 무엇입니까?)를 가져오므 gdb
로 이제 읽기 전용 모드에서도 셸에서 사용할 수 있습니다. 그러면 다음과 같이 할 수 있습니다.
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
... 제대로 열립니다 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.
(그러나 이 예에서는 디버깅 기호가 없기 때문에 그다지 유용하지 않습니다.)
그러나 에서 실행하는 이러한 앱 외에도 qmlscene
Ubuntu Touch 15.03에는 브라우저 앱과 같은 "적절한" 실행 파일도 있는 것 같습니다.
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
...하지만 이런 종류의 명령줄에서는 실행할 수 없습니다. 내가 얻은 가장 가까운 것(위와 유사하게 env
보고된 전화의 터미널 앱에서 실행된 일부 환경 변수를 복사하여)은 다음과 같습니다.
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
... 그러나 다음과 같이 터미널에서 즉시 실패합니다.
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
게다가 이 모든 사업은--desktop_file_hint
Unity8에 필요한 것 같습니다(즉, Unity8은 앱 자체에서 사용하지 않더라도 앱 명령줄을 검사하여 찾을 수 있습니다). 하지만 사라질 수도 있습니다.
...upstart-app-launch를 사용하지 않습니다. 이는 실패를 설명합니다. Desktop_file_hint는 지원되는 앱 실행 수단이 아니며 언제든지 사라질 수 있으므로 UITK는 AP 테스트에서 UAL을 사용하도록 변경해야 합니다.
이는 실제로 최근까지 작동했지만 최근 리팩토링으로 인해 Desktop_file_hint 동작이 중단되었습니다. 지원되는 동작이 아니기 때문에 의존해야 하므로 이전 동작을 복원하는 것보다 UITK를 수정하는 것이 더 좋습니다.
그렇다면 upstart-app-launch
(ie ubuntu-app-launch
)를 사용하여 설치되지 않은 응용 프로그램에서 실행 파일을 어떻게 실행하고 터미널의 전경에서 어떻게 실행합니까? 저는 Android와 마찬가지로 ndk-gdb
Ubuntu SDK에도 비슷한 기능이 있다는 것을 알고 있습니다.Qt Creator를 통해분명히 gdbserver
장치에서 사용됩니다. 그러나 나는 그런 일을 위해 GUI를 시작하지 않는 것을 선호합니다. 실제로 gdb
위에서 설명한 대로 명령줄에서 실행 파일을 인수로 사용하여 구식 방식으로 실행하고 싶습니다.
나는 이것이 장치와 (클래식) 데스크탑에 적용 가능한 init/Upstart, X11/Mir, Gnome/Unity 등의 차이점을 잘 이해하지 못하는 것과 관련이 있다고 생각합니다. 그리고 실제로 무엇이 실행되는지 알 수 없습니다. 터미널 명령줄에서 Ubuntu Touch 앱을 실행하는 방법을 이해할 수 있도록 충분히 설명하고 싶습니다.
답변1
글쎄요, 제가 궁금해했던 몇 가지 사항을 설명하는 뭔가를 찾은 것 같습니다. 하지만 누군가가 적절하고 박식한 답변을 게시해 주기를 바라기 때문에 지금은 이 답변을 받아들이지 않을 것입니다...
어쨌든 리소스는 다음과 같습니다.
버그 #1367871 “ubuntu-app-launch가 실행 파일에 인수를 전달하지 않습니다”: 버그: Ubuntu Application Launcher
https://bugs.launchpad.net/ubuntu-app-launch/+bug/1367871
UAL은 원하는 대로 사용자 지정 바이너리를 실행하도록 설계된 것이 아니라 응용 프로그램을 시작하도록 설계되었습니다. 애플리케이션은 다양한 메타데이터로 정의되지만 핵심 메타데이터 중 하나는 데스크톱 파일입니다. 해당 파일은 응용 프로그램을 시작하는 방법을 정의하며 UAL이 응용 프로그램을 시작하는 방법에 사용하기로 결정한 것입니다. 이러한 방식으로 애플리케이션은 일관된 방식으로 실행될 수 있으며 장치마다 동일합니다. [...]
앱 제한의 까다로운 점은 명령줄 인수와 환경 변수가 실제로는 좋은 조합이 아니라는 것입니다. 클릭 패키지 세계에서 "앱"은 시스템의 나머지 부분과 완전히 분리되어 있습니다. 시스템의 다른 부분(예: ubuntu-app-launch 및 앱 범위)에서 해당 앱을 쉽게 찾을 수 있도록 클릭 시 심볼릭 링크 등을 설정하는 몇 가지 후크가 있습니다. 그러나 이는 명령줄 애플리케이션이 아니며 임의 구성을 사용하여 명령줄에서 단순히 실행할 수는 없습니다.
답변2
저는 Lubuntu를 실행하고 있으며 ssh -Y user@linuxbox로 시작된 원격 셸에서 이것이 잘 작동한다는 것을 알았습니다.
ubuntu-app-launch "qterminal"
qterminal
첫 번째는 Quartz에서 qterminal을 실행하고 비밀번호를 물어볼 필요가 없습니다. 두 번째도 qterminal을 실행하지만 비밀번호가 필요합니다.
첫 번째도 bash를 실행하고 있다고 생각합니다. 달리기를 해보셨나요 lxsession
? 사용할 수는 없지만 이상한 새 휴지통과 Unity Linux 설치 프로그램이 이상하게 나타납니다.