日期:2014-05-16  浏览次数:20592 次

gdb调试扩展脚本开发

最近遇到个bug,数据回档一天,查找发现是数据没有存盘成功造成的,还好用gcore留了尸体,至于为什么存盘不成功我这里不探讨了,主要是从core文件要恢复这一天的数据,里面有些存盘还是挺重要的,调试进去发现需要把一个list中的数据恢复到数据库中,这样我需要根据内存数据写一份SQL脚本来恢复,首先这个list不是stl的list,网上可以搜索gdb扩展开发相关

>>vi gdb.conf

脚本内容如下

define p_list //定义
set logging file /data/log.log  #调试信息重定向到/data/log.log 文件中
set logging on #打开重定向功能
if $argc==1 #argc是参数个数

set $list = $arg0 #arg0就是第一个参数了,arg1为第二个,依次类推
set $head=$list.head
set $current=($list.head.next)
set $size=$list.nSize
set $i=0
while $i<$size
printf "elem[%u]:",$i #printf与c的printf用法类似
p (($current).data).id
set $name=(($current).data).name
printf "名字:%s",$name #这里不能直接这样打印printf "%s"(($current).data).name,报错说内存非法,不知道为啥,用个临时变量就可以了
set $current=($current)->next
set $i++
end
else
printf "error[%u]\n",$argc
end
set logging off #关闭重定向功能
end

保存成功到 /data/gdb.conf

在gdb调试中

gdb>>source /data/gdb.conf

gdb>> p_list val   //这里val就是第一个参数,是个list

这样可以打印所有的list中的data信息,你发现上面的可以直接取data信息的成员变量,gdb会自动识别类型信息

当然我实际的脚本是直接运用printf和重定向调试信息到文件中从而实现了自动生成SQL脚本


其实windows下也有这样的功能,具体见~\Microsoft Visual Studio x.0\Common7\Packages\Debugger\autoexp.dat,里面的stl都处理了,所以你会发现windows调试时stl打印是那么的直观,不过有个缺陷就是微软虽然提供了这个东西,但是没有一丁点的文档来介绍它,所以需要自己多google相关