coredump文件栈破坏
来源:互联网 发布:stm32是单片机还是arm 编辑:程序博客网 时间:2024/04/27 21:09
分享两个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
http://www.nosqlnotes.net/archives/183
- coredump文件栈破坏
- 无符号和栈破坏情况下coredump的分析方法
- 无符号和栈破坏情况下coredump的分析方法
- 关于coredump文件
- VS2010 Coredump文件生成
- 如何分析CoreDump文件
- coredump和core文件
- gdb调试coredump文件
- PHP破坏文件
- redo文件破坏恢复
- gdb调试(查看函数栈、调试coredump文件)
- 调试coredump文件的方法
- 调试coredump文件的方法
- 使用GDB生成coredump文件
- 使用GDB调试Coredump文件
- 用gdb调试coredump文件
- 使用GDB调试Coredump文件
- coredump文件设置及调试
- 管理器与系统服务
- 使用CEGUI的imagesets下的OgreTray.imageset的MouseArrow
- VC++ _variant_t型变量格式化成CString型字符串
- 解决nfs不能自动mount补遗[技术]
- Hibernate 批量更新与删除
- coredump文件栈破坏
- Auto_Ptr
- MapReduce/GFS/BigTable三大技术资料
- 编译hadoop-0.20.2的eclipse-plugin插件
- Linux下sendmail发送邮件
- Ext获取JSON字符串后赋值给联动下拉框
- 关于struts2.1.8 spring ibatis 与 dwr2的整合 遇到的问题
- openssl init destroy
- 汇编源码学习11-子函数模块-输出大整数