1. # 为脚本注释命令
2. 赋值语句:set,
set 命令很强大,
a.它可以是设置gdb 的选项, 例如:
set confirm off
set verbose off
set history filename ~/.gdb_history
set history save
set output-radix 0x10
set input-radix 0x10
set 选项可以用show 命令来查看设置效果
b. set 可以自定义变量,变量以$开始,以便区分是gdb还是调试程序变量。
变量可为全局或局部,视声明位置。
例如:
set $x = 1;
set $SHOW_CONTEXT = 1
set $SHOW_NEST_INSN = 0
set $CONTEXTSIZE_STACK = 6
set $CONTEXTSIZE_DATA = 8
set $CONTEXTSIZE_CODE = 8
set $data_addr = 0x400000
set 自定义变量的效果可以用 p 命令来检查
b.2: set 可以直接引用程序地址,计算代码数据位置,直接引用寄存器,可以打印,修改代码和数据
访问内容数据
set $_byte1 = *(unsigned char *)$pc
set $_byte2 = *(unsigned char *)($pc+1)
set $_byte3 = *(unsigned char *)($pc+2)
修改内存
set *(unsigned char *)$addr = 0x90
访问寄存器:反过来就是修改i寄存器
set $oldeax = $eax
set $oldebx = $ebx
set $oldecx = $ecx
set $oldedx = $edx
set $oldesi = $esi
set $oldedi = $edi
set $oldebp = $ebp
set $oldesp = $esp
自动设置断点:
set $_nextaddress = $pc + 0x3
thbreak *$_nextaddress
set 访问用户程序资源的特性使得它可以监视和控制用户程序,这就是debug的核心所在.
再赋予流程控制,就是脚本语言.
3. 函数声明语句:define .. end 语句
具有一定功能的语句块为函数,目的是重用代码和结构化(就是把功能细分的意思)
define func
end
无行参声明,但可以直接用$arg1,$arg2引用, $argc 为形参个数
4. 显示语句: echo
5. 显示语句: printf
6. 条件语句: if..else..end
7. 循环语句: while .. end
8. 说明(帮助)语句: document.. end
为函数书写帮助说明
9. 常规的gdb 调试命令语句。
10. 支持shell 命令, 可以实现dump, search 等复杂功能
----------------------------------------
自定义 GDB 内存查找
------------------------------------
define search
set $start = (char *) $arg0
set $end = (char *) $arg1
set $pattern = (short) $arg2
set $p = $start
while $p < $end
if (*(short *) $p) == $pattern
printf "pattern 0x%hx found at 0x%x\n", $pattern, $p
end
set $p++
end
end
document search
Syntax: search
| Search for the given pattern beetween $start and $end address.
end
注意:
gdb中使用的变量要加上'$'符号,否则会认为是被调试的程序中的变量
自定义的gdb命令脚本文件,可以用source 命令来导入。
由这几条简单语句已经勾勒出了脚本语言的概貌,可以与计算机交互了! 沟通愉快!