gdb及远程调试
gdb
GDB, GNU 的调试器称为 gdb(ddd),该程序是一个交互式工具,工作在字符模式。
GDB可完成如下的调试任务
- 设置断点;
- 监视程序变量的值;
- 程序的单步执行;
- 修改变量的值。
gdb安装
开放root用户权限:sudo -s
,Linux终端依次输入以下代码即可。
apt-get update
apt-get install gdb
Do you want to continue? [Y/n] y
测试使用:
编写一个简单的 hello.c
#include<stdio.h>
int main(){
printf("Hello World!\n");
}
在可以使用 gdb 调试程序之前,必须使用 -g
选项编译源文件。
- 可在 Makefile 中如下定义 CFLAGS 变量:
CFLAGS = -g
; - 或者在使用gcc编译的时候加上-g选项,
gcc -g -o hello hello.c
。
运行 gdb 调试程序时通常使用如下的命令:
gdb [文件名]
例如使用 gdb 调试 hello,首先gcc -g -o hello hello.c
, 然后gdb hello
gdb调试命令
help NAME
:显示指定命令的帮助信息。
file FILE
:装载指定的可执行文件进行调试。
kill
:终止正被调试的程序。
list
:显示源代码段。
break NUM
:在指定的行上设置断点。
run
:执行当前被调试的程序 。
continue
:继续执行正在调试的程序。
step
:向前执行一行源代码,遇到函数的情况下,进入函数内部执行。
stepi
:执行一条机器指令。
next
:单步执行一条语句,不单步执行进入函数体。
nexti
: 单步执行一条指令,如果该指令是函数调用,那么程序执行直到该函数调用结束时才停止。
set 变量 = 表达式
或 set 变量 := 表达式
:设置程序中变量的值。
display EXPR
每次程序停止后显示表达式的值,表达式由程序定义的变量组成。
print 变量或表达式
:打印变量或表达式的值。
info break
:显示当前断点清单,包括到达断点处的次数等。
info files
:显示被调试文件的详细信息。
info func
:显示所有的函数名称。
info local
:显示当函数中的局部变量信息。
info prog
:显示被调试程序的执行状态。
info var
:显示所有的全局和静态变量名称。
delete 断点号
:清除断点或自动显示的表达式。
disable 断点号列表(断点号之间用空格间隔开)
:让指定断点失效。
enable 断点号列表
:和disable
相反,恢复失效的断点。
ignore 断点号 忽略次数
:忽略断点。
quit
:退出gdb。
gdb 调试步骤
第一步:用-g
选项编译程序 arm-linux -g -o hello hello.c
第二步:gdb 程序 gdb hello
第三步:查看源码 list
第四步:在 main 函数设置断点 break main
第五步:运行 run
第六步:调试 step/next/break/cont/print/display
第七步:退出 quit
嵌入式远程调试
在开发板上运行 gdbserver
在PC端执行
ddd -debugger ./arm-linux-gdb greeting
其他Liunx开发工具
交叉反汇编器 arm-linux-objdump
arm-linux-objdump -D -S hello > out.s
:将反汇编文件输出到out.s
查看elf文件工具 arm-linux-readelf
arm -linux-readelf -a hello
:查看hello可执行文件。
arm-linux-readelf -d hello
:查看可执行文件需要的共享库
图形化开发套件:CODE::BLOCKS
课后作业
(1) 假设温度传感器文件 TempSensor.c 中使用到冒泡排序算法对取到的 10 次温度进行排序,对应函数名为 BubbleFun()
,然后去除最高和最低值,将余下的 8 个温度值相加取平均作为本次测量温度,在编译时希望加上调试信息,则需要在编译选项时添加 (-g),在调试过程中,需要启动程序运行并停止在 BubbleFun()
函数入口处,写出 gdb 调试指令序列流。
gcc -g -o TempSensor TempSensor.c
gdb TempSensor
list
break BubbleFun
run
(2) CODE::BLOCKS是一款(图形开发套件),其底层(需要)arm-linux-gcc 开发套件的支撑。