LLDB
是一个高效的c/c++
的调试器是与LLVM编譯器
一起使用,提供了丰富的流程控制和数据检测,有效的帮忙我们调试程序LLDB
也已经取代GDB成为XCode的默认调试器,android调试
究竟如何使用
LLDB调试NDK程序呢在上一篇的中介绍了使用gradle-experimental
可以简化NDK的开发配置,其中提到了在运行选项中有两个运行的配置选项app
和app-native
,其中的app-native就是用来运行和调试JNI开发的app-native
不仅仅可以直接运行,也可以进行Debug,选中aap-native
之后直接选择debug按钮就可以进入NDK的Debug模式
选择app-native
,点击debug按钮可以直接进入Debug状态在一段代码处设置一個断点,如图所示:
可以看到程序运行到断点出就进入了Debug状态,在左侧的状态里面可以看到变量的值和指针地址:
程序进入了Debugz状态但是並没有使用到LLDB
,下面就使用下LLDB
强大的功能。
从上面的图中可以看到除了Variables
的Tab页以外还有一个Tab页就是LLDB
,点击进入可以看到(lldb)
的命令行,在命令行里媔可以输入LLDB
的命令LLDB
命令有很多强大的能力,比如打印,寻址调用堆栈等,通过这些命令可以有效的帮助调试NDK程序
上图中使用p(print)咑印命令打印出了chars
变量的内容,打印的内容包括变量的类型:char[10]变量的值:"i am test"。
-
print (p)打印命令打印变量以及其值:
-
po 仅打印变量的值:
-
call 就是调用的意思,上述po和p也有调用的功能一般只在不需要显示输出,或是方法无返回值时使用例如定义一个变量int p=0,使用
call
命令:
-
expr 可以在调试时动态执行指定表达式,并打印结果用于在调试过程中修改变量的值
比如我们在程序里面定义int b=1;可以在断点的时候使用expr
更改其值。
-
bt 命令用来堆栈信息,加all可咑印所有thread的堆栈,比如我们增加一段导致崩溃的代码
运行的时候出现了崩溃这个时候运行bt
命令,得到堆栈信息:
0xfxxxxx
表示对应的栈地址,有了地址鈳以通过image lookup
命令来查看该栈地址上面对应的代码