GDB的两个技巧

分享两个GDB的小技巧:

1, GDB失效时手工得到stack;

2, GDB执行用户命令脚本;

调试内存型服务程序的有时会遇到core dump或死锁问题,且gdb或者pstack都无法显示调用栈(call stack)。这是因为线程的调用栈被破坏了,而调用栈存放了函数的返回地址,gdb解析函数返回地址(根据地址查找符号表)失败,gdb也没有进行容错处理,只要有一处地址解析失败就无法展开调用栈。然而幸运的是,调用栈往往只是部分被破坏,RSP堆栈寄存器中保存的值往往也是正确的,可以通过手工的方法恢复。具体做法如下:

(gdb) set logging on
Copying output to gdb.txt.
(gdb) x /2000a $rsp
0x426cb890: 0x0 0x4
0x426cb8a0: 0x426cb8c0 0x100
0x426cb8b0: 0x3e8 0x552f59 <_ZN5tbnet16EPollSocketEvent9getEventsEiPNS_7IOEventEi+41>
0x426cb8c0: 0x1823c8a000000011 0x0
0x426cb8d0: 0x0 0x0
0x426cb8e0: 0x0 0x0
...

如上图,类似”0x552f59 <_ZN5tbnet16EPollSocketEvent9getEventsEiPNS_7IOEventEi+41>”这样的代码符号看起来是有效的。通过所有看似有效的程序代码符号基本能够得出core dump时的调用栈。

当然,有可能出现core dump线程的调用栈被完全破坏的情况,通过上述方法恢复的信息仍然是无效的。由于每个线程堆栈地址空间的大小为10M,因此,线程之间互相破坏调用堆栈的可能性几乎是不存在的,此时,可以通过其它线程的调用栈分析其行为,往往也能找到线索。如果所有线程的调用栈都“看似被破坏”,那么,往往有两种可能:

a, 可执行程序和core文件对不上,被摆乌龙了,如发现core dump问题的时候可执行程序已经更新到最新版本,老版本没有保存;

b, 磁盘满了或者ulimit设置太小,导致core dump文件信息不全;

如果core文件对不上或者信息不全的问题,还可以通过dmesg命令找到程序core dump时的指令寄存器RIP的值,再通过addr2line获取程序最后执行的代码行。如:

[rizhao.ych@OceanBase036040 updateserver]$ dmesg | grep updateserver
updateserver[8099]: segfault at 0000000000000000 rip 0000000000500fbf rsp 000000004c296e30 error 4

[rizhao.ych@OceanBase036040 updateserver]$ addr2line -e updateserver 0000000000500fbf
/home/rizhao/dev/oceanbase/src/common/ob_base_server.cpp:222

另外一个用得比较多的功能是GDB执行用户命令脚本。我们组无施同学有一个例子:Oceanbase系统有一个ObGetParam的类,是一个数组,里面的每个元素是一个ObCellInfo,ObGetParam中可能包含成百上千个ObCellInfo,现在需要在GDB调试的时候输出数组中所有的ObCellInfo对象信息。脚本如下:

define dumpGetParam
set $cell_list = ($arg0)
set $cell_num = ($arg1)
set $cell_idx = (0)
while ($cell_idx < $cell_num)
  printf "cell_idx:%d,table_id:%llu,column_id:%llu\n", $cell_idx,
    $cell_list[$cell_idx].table_id_, $cell_list[$cell_idx].column_id
  set $cell_idx = $cell_idx + 1
end
end

上面的代码定义了一个命令叫dumpGetParam,其第一个参数$arg0是cell数组的地址,第二个参数$arg1是数组大小,代码的功能就是打印所有cell的信息。
把上面的代码写入一个文本文件dump_get_param.txt,在gdb中执行source dump_get_param.txt,然后就可以使用dumpGetParam命令了。

时间: 2024-09-05 09:57:53

GDB的两个技巧的相关文章

Win32开发入门(18):使用对话框的两个技巧

相信大家知道对话框怎么用了,就是先用"资源编辑器"设计一个对话框,然后在代码中加载处理 .今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一 点也不复杂,总之,看俺写的博客,你不会有思想压力的.放心好了. 这两个技巧分别是: 1.在显示某个对话框时,向对话框传递数据. 这个我相信大家能够理解,就好比咱们 在做Web开发的时候,在打开一个页面时,可能会考虑向目标页面传一些参数,如这样http://www.牛 B.com/yyy.aspx?tid=19

WPS 2007文档中进行复杂输入的两则技巧

WPS2007的功能是相当强大的,对于普通办公而言,已经是完全足够了.这里,我们介绍两则关于 WPS2007解决复杂输入的技巧: 技巧一:巧妙输入偏旁部首 对于汉字来说,偏旁部首是一个很重要的概念,不过虽然我们从读书就开始接触偏旁部首,但如果实 际输入的话,恐怕就不是那么方便了. 这里,我们可以使用一个简单的方法来输入偏旁部首,例如需要输入"忄"这个偏旁部首 ,可以首先输入"恨"或其他的字,选中"恨"之后从"插入"菜单 下打开

与excel启动相关的两个技巧

  与excel启动相关的两个技巧           一.开机后自动打开指定的excel文件 如果你每天上班开机后,需要打开一个或多个excel表格.今天的技巧就可以用上了.虽然省不了多少时间,能省一秒是一秒呗! 操作方法: 1 .电脑开始菜单 - 程序 - 右键单击"启动" - 点击"打开"命令. 2.把需要开机启动的excel文件创建一个快捷方式.复制粘贴到"启动"文件夹中. 设置完成!以后再开机时,启动文件夹中的excel文件就会自动打开

Excel2003合并单元格的两个技巧

Excel2003合并单元格的两个技巧   方法一 选中要合并的单元格,单击"格式"工具栏中的"合并及居中". 方法二 1.选中要合并的单元格,格式-单元格 2.切换到"对齐"选项卡,勾选"合并单元格". 效果:以上两种方法都会得到如下效果. word教程 Excel教程 PowerPoint教程

WPS2007文档中进行复杂输入的两则技巧

技巧一:巧妙输入偏旁部首 对于汉字来说,偏旁部首是一个很重要的概念,不过虽然我们从读书就开始接触偏旁部首,但如果实际输入的话,恐怕就不是那么方便了. 这里,我们可以使用一个简单的方法来输入偏旁部首,例如需要输入"忄"这个偏旁部首,可以首先输入"恨"或其他的字,选中"恨"之后从"插入"菜单下打开"符号"对话框,在右下角的"来自(M):"下拉列表框中更改为"简体中文 GB2312(

【ASP.NET】关于iframe的两个技巧

原文:[ASP.NET]关于iframe的两个技巧最近在给朋友写个网站,虽然不大,但是也碰到了一些问题.这篇就为解决ASP.NET中关于IFRAME的两个很现实的问题提供解决方法.PS:呵呵,又做了个小项目,每次都能学到很多啊- 这次把之前积累的一些新学的技术都用进去了. 1.在HTML中制作指向iframe的链接在框架集型的网站中制作一个指向特定框架的链接,只需指定target属性即可.那么能不能用同样的方法来制作指向iframe的链接呢?答案是:能!你只需指定iframe的name属性就可以

分享如何获得高质量内容的两个技巧

现在很多站长认为,网站的内容只要是原创的,那就是好内容,就能够让搜索引擎更好的收录,可是经过一段时间的更新之后,却发现自己的网站内容收录不少,而且内容的排名还凑活,但是就没有什么流量过来,这又是为什么呢?很显然,这是因为这些内容的质量并不高造成的,因为没有多少人去关注这些内容,搜索的次数极少,自然不会给自己的网站流量带来实质上的变化!所以全部是原创并不是建站的好方法,而是去寻找高质量的内容,才是真正的网站运营之道,下面笔者就来分享两个获得高质量内容的技巧! 一:寻找搜索频率相对比较高的文章进行重

SQL Server中处理单引号的两种技巧

和数据库打交道要频繁地用到SQL语句,除非你是全部用控件绑定的方式,但采用控件绑定的方式存在着灵活性差.效率低.功能弱等等缺点.因此,大多数的程序员极少或较少用这种绑定的方式.而采用非绑定方式时许多程序员大都忽略了对单引号的特殊处理,一旦SQL语句的查询条件的变量有单引号出现,数据库引擎就会报错指出SQL语法不对,本人发现有两种方法可以解决和处理这种单引号的问题(以VB为例子). 方法一:利用转义字符处理SQL语句.下面的函数可以在执行SQL语句前调用,执行处理后的结果即可产生正确的结 果. F

两招技巧学会隐藏你的无线网络

无线网络中怎么隐藏电脑 要在无线网络中隐藏自己的电脑,方法有很多,例如单击"开始/运行",然后输入"cmd"开启命令提示符窗口,在该窗口中输入"net config server /hidden:yes",或者在无线网络连接的属性窗口中,取消"Microsoft网络的文件和打印机共享",这样其他人通过网上邻居就无法找到自己的电脑了. 为了防止电脑的IP地址泄漏,可以启动无线网络连接的防火墙功能,并在防火墙属性的"高级