Andorid Studio NDK开发-LLDB调试

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常用命令

  • print (p)打印命令,打印变量以及其值:

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

  • po 仅打印变量的值:

po chars
"i am test"

  • call 就是调用的意思,上述po和p也有调用的功能。一般只在不需要显示输出,或是方法无返回值时使用。例如定义一个变量int p=0,使用call命令:

call p++
(int) $0 = 1

  • expr 可以在调试时动态执行指定表达式,并打印结果,用于在调试过程中修改变量的值
    比如我们在程序里面定义int b=1;可以在断点的时候使用expr更改其值。

expr b=10
(int) $0 = 10

  • bt 命令用来堆栈信息,加all可打印所有thread的堆栈,比如我们增加一段导致崩溃的代码
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用于寻址,可以用来查找栈地址对应的代码位置,image命令有很多的参数,可以帮助我们更加清晰的定位问题,其中比较常用的是image lookup:

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • [转]浅谈LLDB调试器文章来源于:http://www.cocoachina.com/ios/20150126/...
    loveobjc阅读 2,398评论 2 6
  • LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能。平时用Xc...
    CoderSC阅读 1,299评论 0 2
  • from:https://segmentfault.com/a/1190000005738395
    格老子阅读 299评论 0 0
  • 随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器。它与LLVM编译器一...
    随风飘荡的小逗逼阅读 1,331评论 0 0
  • 孟家婧阅读 157评论 1 1