1. 程式人生 > >GDB除錯Android程式碼——環境搭建及除錯過程

GDB除錯Android程式碼——環境搭建及除錯過程

[email protected]:~/java/adt-bundle-linux-x86_64-20140321/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin$ adb forward tcp:1234 tcp:1234
[email protected]:~/java/adt-bundle-linux-x86_64-20140321/android-ndk-r10b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin$ ./arm-linux-androideabi-gdb
GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-linux-android".
For bug reporting instructions, please see:
<http://source.android.com/source/report-bugs.html>.
(gdb) file /home/conan/java/tmp/GDB/app_process
Reading symbols from /home/conan/java/tmp/GDB/app_process...(no debugging symbols found)...done.
(gdb) file /home/conan/java/tmp/eclipse_android/JNI_test/obj/local/armeabi/lib
libJNI_test.so  libstdc++.a     
(gdb) file /home/conan/java/tmp/eclipse_android/JNI_test/obj/local/armeabi/libJNI_test.so
Reading symbols from /home/conan/java/tmp/eclipse_android/JNI_test/obj/local/armeabi/libJNI_test.so...done.
(gdb) set solib-absolute-prefix /home/conan/java/tmp/eclipse_android/JNI_test/obj/local/armeabi
(gdb) set solib-search-path /home/conan/java/tmp/GDB:/home/conan/java/tmp/eclipse_android/JNI_test/obj/local/armeabi
(gdb) target remote :1234
Remote debugging using :1234
warning: Could not load shared library symbols for 118 libraries, e.g. /system/lib/libsigchain.so.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
Reading symbols from /home/conan/java/tmp/GDB/linker...(no debugging symbols found)...done.
Loaded symbols for /home/conan/java/tmp/GDB/linker
Reading symbols from /home/conan/java/tmp/GDB/libc.so...(no debugging symbols found)...done.
Loaded symbols for /home/conan/java/tmp/GDB/libc.so
Reading symbols from /home/conan/java/tmp/eclipse_android/JNI_test/obj/local/armeabi/libJNI_test.so...done.
Loaded symbols for /home/conan/java/tmp/eclipse_android/JNI_test/obj/local/armeabi/libJNI_test.so
0xb6d4a2e4 in __epoll_pwait () from /home/conan/java/tmp/GDB/libc.so
(gdb) list
1#include <jni.h>
2#include <com_example_jni_test_jni.h>
3
4JNIEXPORT jstring JNICALL Java_com_example_jni_1test_jni_sayName
5 (JNIEnv *env, jclass){
6int aaaaaaaaaaaaaaaaaa = 1;
7char bbbbbbbbbbbbbbbbbbb = 'a';
8   return env->NewStringUTF("This is a test message!");
9}
(gdb) dir /home/conan/java/tmp/eclipse_android/JNI_test/jni 
Source directories searched: /home/conan/java/tmp/eclipse_android/JNI_test/jni:$cdir:$cwd
(gdb) list
Line number 10 out of range; jni/JNI_test.cpp has 9 lines.
(gdb) list jni/JNI_test.cpp:5
1#include <jni.h>
2#include <com_example_jni_test_jni.h>
3
4JNIEXPORT jstring JNICALL Java_com_example_jni_1test_jni_sayName
5 (JNIEnv *env, jclass){
6int aaaaaaaaaaaaaaaaaa = 1;
7char bbbbbbbbbbbbbbbbbbb = 'a';
8   return env->NewStringUTF("This is a test message!");
9}
(gdb) b jni/JNI_test.cpp:6
Cannot access memory at address 0xc8c
(gdb) file /home/conan/java/tmp/GDB/app_process
A program is being debugged already.
Are you sure you want to change the file? (y or n) y


Load new symbol table from "/home/conan/java/tmp/GDB/app_process"? (y or n) y
Reading symbols from /home/conan/java/tmp/GDB/app_process...(no debugging symbols found)...done.
(gdb) dir /home/conan/java/tmp/eclipse_android/JNI_test/jni 


Source directories searched: /home/conan/java/tmp/eclipse_android/JNI_test/jni:/home/conan/java/tmp/eclipse_android/JNI_test/jni:$cdir:$cwd
(gdb) b jni/JNI_test.cpp:6
Breakpoint 1 at 0xa0202c8c: file jni/JNI_test.cpp, line 6.
(gdb) b jni/JNI_test.cpp:8
Breakpoint 2 at 0xa0202c9c: file jni/JNI_test.cpp, line 8.
(gdb) c
Continuing.
c


Breakpoint 1, Java_com_example_jni_1test_jni_sayName (env=0xb4d96a80)
    at jni/JNI_test.cpp:6
6int aaaaaaaaaaaaaaaaaa = 1;
(gdb) c
Continuing.


Breakpoint 2, Java_com_example_jni_1test_jni_sayName (env=0xb4d96a80)
    at jni/JNI_test.cpp:8
8   return env->NewStringUTF("This is a test message!");
(gdb) c
Continuing.
c
^C
Program received signal SIGINT, Interrupt.
0xb6d4a2e4 in __epoll_pwait () from /home/conan/java/tmp/GDB/libc.so
(gdb) c
Continuing.


Breakpoint 1, Java_com_example_jni_1test_jni_sayName (env=0xb4d96a80)
    at jni/JNI_test.cpp:6
6int aaaaaaaaaaaaaaaaaa = 1;
(gdb) bt
#0  Java_com_example_jni_1test_jni_sayName (env=0xb4d96a80)
    at jni/JNI_test.cpp:6
#1  0x9f18408e in ?? ()
#2  0x9f18408e in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) c
Continuing.


Breakpoint 2, Java_com_example_jni_1test_jni_sayName (env=0xb4d96a80)
    at jni/JNI_test.cpp:8
8   return env->NewStringUTF("This is a test message!");
(gdb) bt
#0  Java_com_example_jni_1test_jni_sayName (env=0xb4d96a80)
    at jni/JNI_test.cpp:8
#1  0x9f18408e in ?? ()
#2  0x9f18408e in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
(gdb) print aaaaaaaaaaaaaaaaaa
$1 = 1
(gdb) disas
Dump of assembler code for function Java_com_example_jni_1test_jni_sayName(JNIEnv*, jclass):
   0xa0202c78 <+0>:push{r11, lr}
   0xa0202c7c <+4>:addr11, sp, #4
   0xa0202c80 <+8>:subsp, sp, #16
   0xa0202c84 <+12>:strr0, [r11, #-16]
   0xa0202c88 <+16>:strr1, [r11, #-20]
   0xa0202c8c <+20>:movr3, #1
   0xa0202c90 <+24>:strr3, [r11, #-8]
   0xa0202c94 <+28>:movr3, #97; 0x61
   0xa0202c98 <+32>:strbr3, [r11, #-9]
=> 0xa0202c9c <+36>:ldrr0, [r11, #-16]
   0xa0202ca0 <+40>:ldrr3, [pc, #24]; 0xa0202cc0 <Java_com_example_jni_1test_jni_sayName(JNIEnv*, jclass)+72>
   0xa0202ca4 <+44>:addr3, pc, r3
   0xa0202ca8 <+48>:movr1, r3
   0xa0202cac <+52>:bl0xa0202c3c <_JNIEnv::NewStringUTF(char const*)>
   0xa0202cb0 <+56>:movr3, r0
   0xa0202cb4 <+60>:movr0, r3
   0xa0202cb8 <+64>:subsp, r11, #4
   0xa0202cbc <+68>:pop{r11, pc}
   0xa0202cc0 <+72>:andeqr1, r0, r8, lsl #13
End of assembler dump.
(gdb)