转载

GDB 内写脚本调试程序

很多纯 C 语言的项目都会自己开发一套基础数据结构,比如最常见的就是造一个 C++ Vector 或者 String 的轮子,有了 Vector 以后就可以往里面自由 add() 任意类型的数据,在具体实现中用 Void* 做强制类型转换,这样带来的问题是无论 gdb 还是 printf 调试程序,都必须手动转换指针指向的那一块内存区域:强制转换类型、明确数据占据的内存大小。例如 gdb 中打印 vector[0] 或者 vector[i] 的命令就必须写成这样:

print *((unsigned long*)(vec->data + 8*i))

当无法修改程序源码只能用 gdb 时,打印一个 vector 数组是相当蛋疼的事情,好在 gdb 提供了一个自定义命令的功能,或者说可以先把自定义的命令写成一串指定保存到文本中,然后在 gdb 中加载这个文件就可以使用这个命令了:

define printvec set $total = $arg0->n_element // arg0 表示输入的第一个参数,arg1 类推 set $i = 0 print $total while ($i < $total)  print *((unsigned long*)($arg0->data + 8*$i)) set $i = $i+1 end end  (gdb) source cmd.txt (gdb) printvec vec
原文  http://blog.nlogn.cn/gdb-script/
正文到此结束
Loading...