Android GDB 调试
原文地址:https://github.com/mapbox/mapbox-gl-native/wiki/Android-debugging-with-remote-GDB
https://wladimir-tm4pda.github.io/porting/debugging_gdb.html
https://source.android.com/devices/tech/debug/
(未实践!)
Android debugging with remote GDB
- Install Android Studio, SDK and NDK, including build tools and platform tools.
 - Ensure 
android-sdk/toolsandandroid-sdk/platform-toolsare on yourPATH - Build the app with: 
BUILDTYPE=Debug make android - Connect your device via USB
 - Check you can connect to the device by running 
adb shell. You should get the terminal from your device. - Exit with 
exit 
Extract system binaries from device
(You will need to do this for every device and every Android OS version)
- Create a folder to hold the Android system binaries locally e.g. 
~/android cdinto the folder- Create a 
system_libandvendor_libfolder cd system_libadb pull /system/libcd ../vendor_libadb pull /vendor/lib. If you get permissions error you will need to get a list of each file and folder inadb shellthen copy each file one at a time withadb pull /vendor/lib/filecd ..adb pull /system/bin/app_process(or on 64 bit phonesadb pull /system/bin/app_process32andadb pull /system/bin/app_process64)adb pull /system/bin/linker(and on 64 bit phonesadb pull /system/bin/linker64)
Install GDB server
- Go to the NDK folder.
 - Copy 
gdbserverfromandroid-ndk/prebuilt/android-arm/gdbserver/gdbservertomapbox-gl-native/android/java/MapboxGLAndroidSDK/src/main/jniLibs/armeabi-v7a/gdbserver.soIMPORTANT it must be renamed a .so file - Build and run the app in Android Studio
 - Android studio will copy and install the APK with gdbserver in it to your device
 
Start the app paused
- Open the project in Android Studio
 - Place a breakpoint in Java class 
NativeMapViewconstructor onnativeCreateline - Start app with Run -> Debug
 - Wait for app to start and hit breakpoint
 - Open up logcat and look for output from app
 - Note the process ID e.g. in 
11-08 19:25:52.957 31834-31834/com.mapbox.mapboxgl.app V/FragmentActivity﹕ onCreateit is31834 
Start gdbserver
- Open a terminal
 - Run 
adb forward tcp:5039 localfilesystem:/data/data/com.mapbox.mapboxgl.testapp/debug-pipe - Run 
adb shell run-as com.mapbox.mapboxgl.testapp /data/data/com.mapbox.mapboxgl.testapp/lib/gdbserver.so +debug-pipe --attach 31834. Replace31834with the process ID from earlier. (You will need to do this each time you restart the app as the PID will change) 
If you get the error `then you have a version of Android not compatible withadb run-as`. See [this page] for information. It appears to affect Android updates in 4.2.2, 4.3, 5.0, 5.1.1. Workaround appears to be to load a fresh image.
You should see: Attached; pid = 31834 Listening on sockaddr socket debug-socket
- Leave the terminal open
 
Start gdb
- Open another terminal
 - Go to the NDK folder 
android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin - On OSX use 
android-ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin - Run 
./arm-linux-androideabi-gdb ~/android/app_process target remote :5039- In GDB: 
set solib-search-path ~/android/:~/android/system_lib:~/android/vendor_lib:~/android/vendor_lib/egl:~/path/to/mapbox-gl-native/build/android-arm-v7/Debug/lib.target/ - Check that all the debug symbols were loaded with 
info sharedlibrary - Check each .so has 
Yes (*)except for the lastlibmapbox-gl.sowhich must have onlyYesi.e. (no star). If not double check yoursolib-search-path b jni.cpp:183(the first line ofnativeCreate)c- Switch to Android Studio
 - Click Run -> Resume Program
 - Switch back to GDB. It should be paused at 
nativeCreate - GDB now has control, so 
cwill continue execution (set breakpoints first) Note: If you encounter this crash: 
Program received signal SIGILL, Illegal instruction.
0x7956a3a8 in _armv7_tick () from /home/leith/dev/mapbox-gl-native-mason/build/android/out/Debug/lib.target/libmapbox-gl.so
(gdb) bt
#0  0x7956a3a8 in _armv7_tick () from /home/leith/dev/mapbox-gl-native-mason/build/android/out/Debug/lib.target/libmapbox-gl.so
#1  0x795d1ccc in OPENSSL_cpuid_setup () from /home/leith/dev/mapbox-gl-native-mason/build/android/out/Debug/lib.target/libmapbox-gl.so
#2  0x400bd9c6 in ?? () from /home/leith/dev/android/linker
#3  0x400bda9e in ?? () from /home/leith/dev/android/linker
#4  0x400bdbf0 in ?? () from /home/leith/dev/android/linker
#5  0x400bdc6e in ?? () from /home/leith/dev/android/linker
#6  0x400bc1a6 in _start () from /home/leith/dev/android/linker
#7  0x41643c86 in dvmLoadNativeCode(char const*, Object*, char**) () from /home/leith/dev/android/system_lib/libdvm.so
#8  0x416600f4 in ?? () from /home/leith/dev/android/system_lib/libdvm.so
#9  0x41613ee8 in dvmJitToInterpNoChain () from /home/leith/dev/android/system_lib/libdvm.so
#10 0x41613ee8 in dvmJitToInterpNoChain () from /home/leith/dev/android/system_lib/libdvm.so
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
You just need to c past it to the real crash. From https://bugs.launchpad.net/raspbian/+bug/1154042:
Afaict openssl probes the capabilities of the user's CPU by trying to do things and trapping the illegal instruction errors. So a couple of sigills during startup is normal. When using a debugger in order to find the real failure in your application you must continue past the startup sigills. 14. Use GDB commands to debug
Read http://condor.depaul.edu/glancast/373class/docs/gdb.html for GDB commands
                    
                
                
            
        
浙公网安备 33010602011771号