这个指南提供基本推荐来使用ndk-gdb调试native移动VR公厕,并试图弥补相关AndroidStudio文档。
NDK包含一个有用的调试工具ndk-gdb,一个小shell脚本wrapper GDB。从命令行使用ndk-gdb添加便利特征到你的调试工作流中,例如,添加断点,单步调试,检查变量。
建立断点
函数断点
(gdb) break SomeFunctionName()或者(gdb)break SomeClass::SomeMethod()
使用用例:
(gdb) break OVR::VrCubeWorld::Frame(OVR::VrFrame const&) Breakpoint 2 at 0xf3f56118: file jni/../../../Src/VrCubeWorld_Framework.cpp,注意:GDB支持符号名字的完整表格。
文件行断点:(gdb) break SomeFile.cpp:256
条件断点
添加if<some condition>到你断点命令的后面。
例如:
(gdb) break OVR::VrCubeWorld::Frame(OVR::VrFrame const&) if vrFrame.PredictedDisplayTimeInSeconds > 24250.0 Breakpoint 6 at 0xf3f58118: file jni/../../../Src/VrCubeWorld_Framework.cpp, line 292.在当前执行时断点
例如:
(gdb) break OVR::VrCubeWorld::Frame(OVR::VrFrame const&) if vrFrame.PredictedDisplayTimeInSeconds > 24250.0 Breakpoint 6 at 0xf3f58118: file jni/../../../Src/VrCubeWorld_Framework.cpp, line 292.当一个应用正在运行时,按下control-c来立即打断和停下gdb提示。
单步
单步调试
(gdb)next或者(gdb)n
单步进入
(gdb)step或者(gdb)s
继续运行
(gdb)continue或者c
打印
打印结构
你可以使能飘亮的打印模式,添加新行在结构元素之间:(gdb)set print pretty on
为了打印结构:(gdb)print SomeStructVariable
例如:
(gdb) print currentRotation $1 = { x = 23185.9961, y = 23185.9961, z = 0, static ZERO = { x = 0, y = 0, z = 0, static ZERO = <same as static member of an already seen type> } }printf
例如:
(gdb) printf "x = %f\n", currentRotation.x x = 23185.996094断点命令
GDB断点可以被自动认真的执行任意命令在被击中之前。这个特征是有用的在插入打印到你的代码而不用重新编译或甚至修改数据在关键点(在你的程序中不用犹豫完全执行)。它通过命令行控制。
你可以指定断点号用一个随意的单一参数;如果遗漏,最后断点被使用。一系列的用>开始的行展示位你,在这儿你可以键入GDB命令(他们会在命中断点时被执行),直到命令序列用end被终止。
在下面的例子中,我们创建一个断点自动打印一个局部变量的值随后继续执行,在命中时:
(gdb) break OVR::VrCubeWorld::Frame(OVR::VrFrame const&) Breakpoint 1 at 0xf3f56118: file jni/../../../Src/VrCubeWorld_Framework.cpp, line 292. (gdb) commands Type commands for breakpoint(s) 1, one per line. End with a line saying just "end". >silent >printf "time = %f\n", vrFrame.PredictedDisplayTimeInSeconds >continue >end文本用户接口(TUI)
为了使用或不使用TUI,按下CTRL+a后按下CTRL+x。
更多的TUI键盘快捷键信息,请看:https://sourceware.org/gdb/onlinedocs/gdb/TUI-Keys.html。