一般交叉编译已经自带了 gdb 和 gdbserver
路径:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
如果交叉编译器自带了 gdb 和 gdbserver 的话只需要将 gdbserver 拷贝到开发板根文件系统
的/bin 目录下
编写一个测试应用
- #include <stdio.h>
- #include <unistd.h>
- int main(int argc, char *argv[])
- {
- unsigned int times = 0;
- while(1) {
- printf("runing times:%d\r\n", times);
- times++;
- sleep(1);
- }
- }
arm-linux-gnueabihf-gcc gdbtest.c -o gdbtest -g | //编译测试程序,注意-g 选项 |
一切准备就绪以后就可以使用GDB进行调试了,确保ubuntu和开发板可以进行网络通信。
在开发板中输入如下命令:
gdbserver 192.168.1.253:2001 gdbtest //启动开发板上的 gdbserver
接着在 ubuntu 中输入如下命令启动 gdb 调试工具:
arm-linux-gdb gdbtest
最下面的(gdb)行用于输入命令,输入如下命令连接到开发板上:
target remote 192.168.1.251:2001 //连接到开发板上
l 命令
l 命令(list)用于列出所有程序源码,
b 命令
b 命令(break)用于设置断点,也可以用缩写“b”,后面可以跟具体的函数或者行号,比如
“break main”表示在 main 函数处设置断点,“break 11”在第 11 行设置断点。
c 命令
c 命令用于运行到断点处,输入 c 命令程序就会运行,直到下一个断点处,
s 命令
s 命令(step)是单步运行执行,此函数会进入到函数里面。
n 命令
n 命令(next)也是单步运行,但是 n 命令不会进入到函数里面。
p 命令
p 命令(print)用于打印某个变量值。
q 命令
q 命令(quit)用于退出调试,开发板上的 gdbserver 也会停止。
常用命令:
start:开始执行程序,在main函数的第一条语句停下来,简写:s。
list:显示多行源代码,简写:l。
break 行号:设置断点,程序到断点的位置会停下来 ,简写:b。
continue:继续程序运行,直到遇到下一个断点 ,简写:c。
print:打印内部变量值
kill:终止正在调试的程序
watch:在程序中设置一个监测点,监视变量的变化
display:跟踪查看某一个变量,每次停下来都显示它的值
delete 行号:删除一个断点或监测点
step:执行下一条语句,如果该语句为函数调用,则进入函数执行其中第一条语句
finish:如果已经进入了某函数,而想退出该函数返回到它的调用函数,可使用该命令
next:单步执行,不可跟踪到函数内部
jump:设定了多个断点,会跳到另一个断点继续执行,在源程序中的另一点开始运行
whatis 变量或函数:显示某个函数或变量的类型
set variable 设置变量的值
backtrace bt :查看函数调用的信息对栈
backtrace n = bt n : n 是一个正整数,表示只打印栈顶上n层的栈信息 ;
n 是一个负整数,表示只打印栈底下n层的栈信息
frame n :查看栈帧 ,n是一个从0开始的整数,是栈中的层编号。
up n:表示向栈的上面移动n层,可不打n,表示上移动一层
down n:表示向栈的下面移动n层,可不打n,表示下移动一层