gdb支持命令脚本和python脚本,但是python脚本需要官方编译gdb时带上python支持才行,一般嵌入式的gdb不一定带,本文不讨论这个,仅讨论命令脚本。
GDB脚本(.gdb文件)本质上是GDB命令的序列 ,支持大多数GDB交互式命令以及专门的脚本控制命令。然后以sourcexx.gdb这样命令执行该脚本,以下是详细的语法和功能:
1. 每行一个命令 (分号分隔会报错),例如 break main 等标准命令都可以用,注释以#开头
如果一个命令分多行写,那么 用 \ 换行,反斜杠后不要有空格 :\ 后直接换行,不要留空格
2. 变量定义和赋值,set $var = 0
3. 打印命令:
print用于打印变量的值,例如print/x var # 十六进制格式,print/d var # 十进制格式(默认),输出为 1 = xx 的形式,也就是会自动生成一个历史变量 1,后续直接可以用这个变量
output类似print用于打印变量值,但是不会生成历史变量,直接打印结果
printf格式化打印,printf "ar1=%d, ar2=%d\n", 1, 2
display自动打印指定变量,每次程序暂停后,都会自动打印这些值(即一般用于监控变量用途),例如display var1,那么每次程序遇到断点等暂停时,都会自动打印var1的值,除非undisplay命令清理掉指定变量
ptype显示类型信息,ptype var # 显示变量类型,ptype struct_name # 显示结构体定义
echo用于输出纯文本,且不处理转义符,例如echo helloworld
4. 流程控制,不支持完全的程序控制结构(如switch-case)
# if语句
if condition
commands
else
commands
end
# while循环
while condition
commands
end
# loop_break和loop_continue(GDB 8.0+)
#set $i = 0
while $i < 10
if $i == 5
loop_break
end
print $i
set $i = $i + 1
end
5. 用户自定义命令,然后命令行直接输入该命令名,即可执行,例如输入下面的mycmd
define mycmd
echo 开始执行自定义命令\n
info registers
x/10i $pc
end
# 带参数的命令
define print_args
print $arg0
print $arg1
end
# 使用:print_args 10 20
6. 日志文件控制(待验证)
# 设置日志文件名
set logging file mylog.txt
# 开启日志功能
set logging on
# 关闭日志功能
set logging off
# 设置为覆盖模式(清空文件)
set logging overwrite on
# 设置为追加模式(不清空)
set logging overwrite off
# 设置是否在终端显示(on=不显示,off=显示)
set logging redirect on
# 创建自定义日志函数
define mylog
set logging on
print $arg0
set logging off
end
# 使用
mylog variable_name
# 创建一个完整记录流程
define full_log
# 清空文件
set logging file log.txt
set logging overwrite on
set logging on
set logging off
set logging overwrite off
# 开始记录特定输出
set logging redirect on
set logging on
# 记录时间戳
shell date
# 你的print命令
print var1
print var2
print *ptr
# 结束记录
set logging off
set logging redirect off
end
shell echo "Backtrace:" >> D:/file/project/Project4_hal_small/log.txt 这条命令能用