Próbuję wykonać natywne debugowanie kodu w moim telefonie HTC Desire dla mojego projektu Android. Projekt składa się z cienkiej warstwy opakowania JNI i głównej części w C++, skompilowanej przy użyciu ndk-build. Flaga debuggable jest ustawiona, ja pracuję 2.2 na HTC Desire i pracuję z Ubuntu na moim komputerze.Android Natywne debugowanie (ndk-gdb) w HTC Desire: run-as fault?
Więc zwykły NDK-gdb --start zwraca:
ERROR: Could not setup network redirection to gdbserver?
Maybe using --port=<port> to use a different TCP port might help?
To jest dziwne. Sprawdziłem w Internecie i odkryłem, że jest to błąd nieprawidłowego komunikatu spowodowany przez lukę w ndk-gdb. Jeśli uruchomię NDK-gdb - start --verbose mogę uzyskać to pomieszane błąd:
Android NDK installation path: /home/marco/dev/android-ndk
Using specific adb command: /home/marco/dev/android-sdk//platform-tools/adb
ADB version found: Android Debug Bridge version 1.0.26
Using final ADB command: '/home/marco/dev/android-sdk//platform-tools/adb'
Using auto-detected project path: .
Found package name: com.marco83.siege
ABIs targetted by application: armeabi
Device API Level: 8
Device CPU ABIs: armeabi-v7a armeabi
Compatible device ABI: armeabi
Found debuggable flag: true
Found device gdbserver: /data/data/com.marco83.siege/lib/gdbserver
Using gdb setup init: /home/marco/dev/siege_game/trunk/SiegeGameNative/libs/armeabi/gdb.setup
Using toolchain prefix: /home/marco/dev/android-ndk/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-
Using app out directory: /home/marco/dev/siege_game/trunk/SiegeGameNative/obj/local/armeabi
Found data directory: 'run-as: Package 'com.marco83.siege' has corrupt installation'
Found first launchable activity: .Main
Launching activity: com.marco83.siege/.Main
## COMMAND: /home/marco/dev/android-sdk//platform-tools/adb shell am start -n com.marco83.siege/.Main
Starting: Intent { cmp=com.marco83.siege/.Main }
Warning: Activity not started, its current task has been brought to the front
## COMMAND: /home/marco/dev/android-sdk//platform-tools/adb shell sleep 2
Found running PID: 844
Launched gdbserver succesfully.
Setup network redirection
## COMMAND: /home/marco/dev/android-sdk//platform-tools/adb forward tcp:5039 localfilesystem:run-as: Package 'com.marco83.siege' has corrupt installation/debug-socket
## COMMAND: /home/marco/dev/android-sdk//platform-tools/adb shell run-as com.marco83.siege lib/gdbserver +debug-socket --attach 844
Android Debug Bridge version 1.0.26
-d - directs command to the only connected USB device
returns an error if more than one USB device is present.
-e - directs command to the only running emulator.
returns an error if more than one emulator is running.
-s <serial number> - directs command to the USB device or emulator with
the given serial number. Overrides ANDROID_SERIAL
environment variable.
-p <product name or path> - simple product name like 'sooner', or
a relative/absolute path to a product
out directory like 'out/target/product/sooner'.
If -p is not specified, the ANDROID_PRODUCT_OUT
environment variable is used, which must
be an absolute path.
devices - list all connected devices
connect <host>[:<port>] - connect to a device via TCP/IP
Port 5555 is used by default if no port number is specified.
disconnect [<host>[:<port>]] - disconnect from a TCP/IP device.
Port 5555 is used by default if no port number is specified.
Using this ocmmand with no additional arguments
will disconnect from all connected TCP/IP devices.
device commands:
adb push <local> <remote> - copy file/dir to device
adb pull <remote> [<local>] - copy file/dir from device
adb sync [ <directory> ] - copy host->device only if changed
(-l means list but don't copy)
(see 'adb help all')
adb shell - run remote shell interactively
adb shell <command> - run remote shell command
adb emu <command> - run emulator console command
adb logcat [ <filter-spec> ] - View device log
adb forward <local> <remote> - forward socket connections
forward specs are one of:
tcp:<port>
localabstract:<unix domain socket name>
localreserved:<unix domain socket name>
localfilesystem:<unix domain socket name>
dev:<character device name>
jdwp:<process pid> (remote only)
adb jdwp - list PIDs of processes hosting a JDWP transport
adb install [-l] [-r] [-s] <file> - push this package file to the device and install it
('-l' means forward-lock the app)
('-r' means reinstall the app, keeping its data)
('-s' means install on SD card instead of internal storage)
adb uninstall [-k] <package> - remove this app package from the device
('-k' means keep the data and cache directories)
adb bugreport - return all information from the device
that should be included in a bug report.
adb help - show this help message
adb version - show version num
DATAOPTS:
(no option) - don't touch the data partition
-w - wipe the data partition
-d - flash the data partition
scripting:
adb wait-for-device - block until device is online
adb start-server - ensure that there is a server running
adb kill-server - kill the server if it is running
adb get-state - prints: offline | bootloader | device
adb get-serialno - prints: <serial-number>
adb status-window - continuously print device status for a specified device
adb remount - remounts the /system partition on the device read-write
adb reboot [bootloader|recovery] - reboots the device, optionally into the bootloader or recovery program
adb reboot-bootloader - reboots the device into the bootloader
adb root - restarts the adbd daemon with root permissions
adb usb - restarts the adbd daemon listening on USB
adb tcpip <port> - restarts the adbd daemon listening on TCP on the specified port
networking:
adb ppp <tty> [parameters] - Run PPP over USB.
Note: you should not automatically start a PPP connection.
<tty> refers to the tty for PPP stream. Eg. dev:/dev/omap_csmi_tty1
[parameters] - Eg. defaultroute debug dump local notty usepeerdns
adb sync notes: adb sync [ <directory> ]
<localdir> can be interpreted in several ways:
- If <directory> is not specified, both /system and /data partitions will be updated.
- If it is "system" or "data", only the corresponding partition
is updated.
environmental variables:
ADB_TRACE - Print debug information. A comma separated list of the following values
1 or all, adb, sockets, packets, rwx, usb, sync, sysdeps, transport, jdwp
ANDROID_SERIAL - The serial number to connect to. -s takes priority over this if given.
ANDROID_LOG_TAGS - When used with the logcat option, only these debug tags are printed.
ERROR: Could not setup network redirection to gdbserver?
Maybe using --port=<port> to use a different TCP port might help?
[email protected]:~/dev/siege_game/trunk/SiegeGameNative$ run-as: Package 'com.marco83.siege' has corrupt installation
które, jak widać, jak podano tutaj: http://vilimpoc.org/blog/2010/09/23/hello-gdbserver-a-debuggable-jni-example-for-android/ spowodowany jest mieszanką różnych wyjść jednoczesnych; rzeczywisty błąd powinno być
Package 'xxxxx' has corrupt installation
Dalsze badania w tym błędzie wskazał mi: http://osdir.com/ml/android-ndk/2010-08/msg00263.html
gdzie ten sam błąd został zgłoszony, a oni mówią, że nie jest to możliwe do debugowania natywnie na pragnienie. Problem polega na tym, że run-as
nie może uzyskać dostępu do folderu/data.
Jakieś rozwiązanie inne niż rootowanie/flashowanie telefonu? Dlaczego dostęp/dane do run-as
? Myślałem o naiwnym rozwiązaniu, w którym kopiuję pakiet (objs, libs, ...) do łatwiej dostępnej lokalizacji (jak na karcie SD) i mówię debuggerowi, aby zamiast tego miał dostęp do tej lokalizacji - czy jest to wykonalne?
Dzięki Marco
EDIT: Aktualizacja: I zakorzenione telefon używając unrevoked3. Nawet jeśli ustawię chmod 0777 data
(który jest prawdopodobnie bardzo niebezpieczny), pojawia się ten sam błąd. Jak podano w drugim łączu w poście, run-as sprawdza, czy dane są dostępne. Jak uzyskać dostęp do kodu źródłowego "run-as"? Czy można ją przekompilować i przesłać zmodyfikowaną wersję, która obejmie kontrolę? (ponieważ mogę ustawić/dane mogą być odczytywane przez wszystkich w każdym razie)
Dzięki, spróbuję, że najszybciej i poinformujemy, czy to działa! – Marco83
Widzę ten sam problem na Nexus One i Xoom. Oba mają ustawione uprawnienia katalogów/data na 771, co oznacza, że nawet sprawdzenie istnienia gdbserver na urządzeniu (które robi ndb-gdb) nie będzie działać. –