演示一个gdb 跟踪结构变量变化的例子, 每次单步运行之后,即检查变量有没有发生变化的自动化脚本.(目前成功的是单步执行前执行)
先上简单测试代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Test
{
int a;
int b;
}Test;
int main()
{
Test test;
test.a=10;
test.b=20;
printf("a:%d\n",test.a);
test.a=50;
printf("a:%d\n",test.a);
return 0;
}
编译生成gdbTest 执行文件
用如下脚本来调试
$ cat 1.gdb
# 这个命令只是演示, 由此也可以写更复杂和更完善的命令
file gdbTest
set $_a = 0
set $_b = 0
define SaveAndCmp
if $_a == $arg0.a && $_b == $arg0.b
printf "same\n"
else
printf "not same\n"
printf "$_a:%d,$newA:%d\n",$_a,$arg0.a
printf "$_b:%d,$newB:%d\n",$_b,$arg0.b
set $_a = $arg0.a
set $_b = $arg0.b
end
end
# 其实我更希望hookpost-next, 但它不能执行说
# No symbol "test" in current context. 我不知道为什么
# hook-next 运行挺好, 只是它是在运行next命令之前执行
define hook-next
SaveAndCmp test
end
b main
r
运行结果如图: