AndroidAndroid开发

Andorid Studio NDK开发-LLDB调试

2016-06-16  本文已影响2501人  姜家志

LLDB是一个高效的c/c++的调试器,是与LLVM编译器一起使用,提供了丰富的流程控制和数据检测,有效的帮忙我们调试程序。LLDB也已经取代GDB成为XCode的默认调试器,Android Studio中也可以使用LLDB调试NDK程序,在Android Studio也中可以LLDB,从SDK Tools中下载LLDB最新版本,配合Android Studiogradle-experimental一起调试NDK项目,会更加的方便。

LLDB安装

Androis StudioToolbar中可以找到Android的更新图标,打开可以看到Android SDK的升级配置,在SDK Tools中可以找到LLDB的安装选项。

安装LLDB

究竟如何使用LLDB调试NDK程序呢?在上一篇的Andorid Studio NDK 开发 - NDK 开发利器 gradle-experimental中介绍了使用gradle-experimental可以简化NDK的开发配置,其中提到了在运行选项中有两个运行的配置选项appapp-native,其中的app-native就是用来运行和调试JNI开发的。app-native不仅仅可以直接运行,也可以进行Debug,选中aap-native之后,直接选择debug按钮就可以进入NDK的Debug模式

Debug JNI

选择app-native,点击debug按钮可以直接进入Debug状态,在一段代码处设置一个断点,如图所示:

断点

可以看到程序运行到断点出,就进入了Debug状态,在左侧的状态里面可以看到变量的值和指针地址:

变量信息
程序进入了Debugz状态,但是并没有使用到LLDB,下面就使用下LLDB强大的功能。

使用LLDB

从上面的图中可以看到除了Variables的Tab页以外,还有一个Tab页就是LLDB,点击进入可以看到(lldb)的命令行,在命令行里面可以输入LLDB的命令,LLDB命令有很多强大的能力,比如,打印,寻址,调用堆栈等,通过这些命令可以有效的帮助调试NDK程序。

lldb
上图中使用p(print)打印命令打印出了chars变量的内容,打印的内容包括变量的类型:char[10],变量的值:"i am test"。

LLDB常用命令

p chars
(char [10]) $0 = "i am test"

po chars
"i am test"

call p++
(int) $0 = 1

expr b=10
(int) $0 = 10

JNIEXPORT jstring JNICALL
Java_com_jjz_NativeUtil_firstNative(JNIEnv *env, jclass type) {
    char chars[] = "i am test";
    int p=0;
    p=1/0;
    return (*env)->NewStringUTF(env, chars);
}

运行的时候出现了崩溃,这个时候运行bt命令,得到堆栈信息:

*thread #1, name = 'com.jjz', stop reason = signal SIGFPE
  * frame #0: 0xf6ff35e8 libc.so`tgkill + 12
    frame #1: 0xf6ff11ec libc.so`pthread_kill + 36
    frame #2: 0xf6fcd846 libc.so`raise + 14
    frame #3: libexperiment.so`__aeabi_idiv0 at lib1funcs.S:1337
    frame #4: libexperiment.so`Java_com_jjz_NativeUtil_firstNative(env=0xf4218ea0, type=0xff8b732c) at experiment.c:16
    frame #5: base.odex`java.lang.String com.jjz.NativeUtil.firstNative() at NativeUtil.java:0
    frame #6: base.odex`void com.jjz.MainActivity.onCreate(android.os.Bundle) at MainActivity.java:15
    frame #7: 0x729d58bf

image lookup --address 0xfxxxxx
0xfxxxxx表示对应的栈地址,有了地址可以通过image lookup命令来查看该栈地址上面对应的代码。

上一篇 下一篇

猜你喜欢

热点阅读