Linux Debugging(五): coredump 分析入门

简介:

        作为工作几年的老程序猿,肯定会遇到coredump,log severity设置的比较高,导致可用的log无法分析问题所在。 更悲剧的是,这个问题不好复现!所以现在你手头唯一的线索就是这个程序的尸体:coredump。你不得不通过它,来寻找问题根源。

      通过上几篇文章,我们知道了函数参数是如何传递的,和函数调用时栈是如何变化的;当然了还有AT&T的汇编基础,这些,已经可以使我们具备了一定的调试基础。其实,很多调试还是需要经验+感觉的。当然说这句话可能会被打。但是你不得不承认,随着调试的增多,你的很多推断在解决问题时显得很重要,因此,我们需要不断积累经验,来面对各种case。

     导致coredump的原因很多,比如死锁,这些还不要操作系统相关的知识,这些问题的分析不在本文的讨论范围之内。大家敬请期待接下来的文章吧!本文从一个非常典型的coredump入手。

     请下载本文用到的coredump: Linux Debugging: coredump 分析入门的材料

     首先使用gdb a.out core.25992打开这个core

     看一下backtrace是什么:   

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400703 in __do_global_dtors_aux ()
(gdb) bt
Cannot access memory at address 0x303938373635343b
出错的地方很奇怪,而且整个callstack都被破坏了,因此首先看一下寄存器和bp是否正常:

 

(gdb) i r
rax            0x7fffffffe040   140737488347200
rbx            0x400820 4196384
rcx            0x3332312c21646c72       3689065110378409074
rdx            0x0      0
rsi            0x40091d 4196637
rdi            0x7fffffffe059   140737488347225
rbp            0x3039383736353433       0x3039383736353433
rsp            0x7fffffffe060   0x7fffffffe060
r8             0x30393837363534 13573712489362740
r9             0x7ffff7dc3680   140737351792256
r10            0xffffffffffffffff       -1
r11            0x7ffff7389ae0   140737341070048
r12            0x400660 4195936
r13            0x7fffffffe180   140737488347520
r14            0x0      0
r15            0x0      0
rip            0x400703 0x400703 <__do_global_dtors_aux+83>
eflags         0x10202  [ IF RF ]
cs             0x33     51
ss             0x2b     43
ds             0x0      0
es             0x0      0
fs             0x0      0
gs             0x0      0
fctrl          0x37f    895
fstat          0x0      0
ftag           0xffff   65535
fiseg          0x0      0
fioff          0x0      0
foseg          0x0      0
fooff          0x0      0
fop            0x0      0
mxcsr          0x1f80   [ IM DM ZM OM UM PM ]
(gdb) x/i $rip
0x400703 <__do_global_dtors_aux+83>:    fidivl -0x1e(%rdx)
(gdb) x/20i $rip-10
0x4006f9 <__do_global_dtors_aux+73>:    add    %cl,-0x75(%rax)
0x4006fc <__do_global_dtors_aux+76>:    adc    $0x200947,%eax
0x400701 <__do_global_dtors_aux+81>:    cmp    %rbx,%rdx
0x400704 <__do_global_dtors_aux+84>:    jb     0x4006e8 <__do_global_dtors_aux+56>
0x400706 <__do_global_dtors_aux+86>:    movb   $0x1,0x200933(%rip)        # 0x601040 <completed.6159>
0x40070d <__do_global_dtors_aux+93>:    add    $0x8,%rsp
0x400711 <__do_global_dtors_aux+97>:    pop    %rbx
0x400712 <__do_global_dtors_aux+98>:    leaveq
0x400713 <__do_global_dtors_aux+99>:    retq
0x400714 <__do_global_dtors_aux+100>:   nopw   %cs:0x0(%rax,%rax,1)
0x400720 <frame_dummy>: push   %rbp
0x400721 <frame_dummy+1>:       cmpq   $0x0,0x2006df(%rip)        # 0x600e08 <__JCR_LIST__>
0x400729 <frame_dummy+9>:       mov    %rsp,%rbp
0x40072c <frame_dummy+12>:      je     0x400748 <frame_dummy+40>
0x40072e <frame_dummy+14>:      mov    $0x0,%eax
0x400733 <frame_dummy+19>:      test   %rax,%rax
0x400736 <frame_dummy+22>:      je     0x400748 <frame_dummy+40>
0x400738 <frame_dummy+24>:      mov    $0x600e08,%edi
0x40073d <frame_dummy+29>:      mov    %rax,%r11
0x400740 <frame_dummy+32>:      leaveq

rbp的值很奇怪,基本确定栈被破坏了(bt不正常,也应该看一下栈是否出问题了)。打印一下栈的内容,看是否栈被写坏了:

(gdb) x/30c $rsp-20
0x7fffffffe04c: 33 '!'  44 ','  49 '1'  50 '2'  51 '3'  52 '4'  53 '5'  54 '6'
0x7fffffffe054: 55 '7'  56 '8'  57 '9'  48 '0'  0 '\000'        7 '\a'  64 '@'  0 '\000'
0x7fffffffe05c: 0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'
0x7fffffffe064: 0 '\000'        0 '\000'        0 '\000'        0 '\000'        -21 '\353'      5 '\005'
我们看到了特殊的字符!,1234567890。当然实际的生产环境可能不会这么简单,比如笔者曾经遇到过这个字符串是/local/share/tracker_...这种目录的字符串,后来发现拼接路径的时候出现错误导致路径非常长,在路径拷贝的时候出现了写坏栈的情况。

多打印一下栈的内容:

(gdb) x/40c $rsp-40
0x7fffffffe038: -100 '\234'     7 '\a'  64 '@'  0 '\000'        1 '\001'        0 '\000'        0 '\000'        0 '\000'
0x7fffffffe040: 72 'H'  101 'e' 108 'l' 108 'l' 111 'o' 44 ','  32 ' '  119 'w'
0x7fffffffe048: 111 'o' 114 'r' 108 'l' 100 'd' 33 '!'  44 ','  49 '1'  50 '2'
0x7fffffffe050: 51 '3'  52 '4'  53 '5'  54 '6'  55 '7'  56 '8'  57 '9'  48 '0'
0x7fffffffe058: 0 '\000'        7 '\a'  64 '@'  0 '\000'        0 '\000'        0 '\000'        0 '\000'        0 '\000'
可以看出,字符串"Hello, World!,1234567890"这个字符串溢出导致栈被破坏。

我们不应该用rbp打印吗?

      还记得在函数返回时,rbp会恢复为上一层调用者的bp吗?因为字符串溢出/越界,导致已经恢复不了原来的bp了。

       这个bug很简单。实际上,有的coredump就是这种无心的错误啊。


尊重原创,转载请注明出处: anzhsoft  http://blog.csdn.net/anzhsoft/article/details/18762915

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
2月前
|
安全 Linux iOS开发
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
368 53
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
2月前
|
Linux API iOS开发
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
227 14
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
3月前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.5 (macOS, Linux, Windows) - 机器数据管理和分析
Splunk Enterprise 9.4.5 (macOS, Linux, Windows) - 机器数据管理和分析
142 0
|
Unix Linux iOS开发
Splunk Enterprise 10.0.0 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台
Splunk Enterprise 10.0.0 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台
137 0
|
9月前
|
监控 Linux
Linux基础:文件和目录类命令分析。
总的来说,这些基础命令,像是Linux中藏匿的小矮人,每一次我们使用他们,他们就把我们的指令准确的传递给Linux,让我们的指令变为现实。所以,现在就开始你的Linux之旅,挥动你的命令之剑,探索这个充满神秘而又奇妙的世界吧!
171 19
|
10月前
|
缓存 网络协议 Linux
PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘
本文详细介绍了 Realtek RTL8125B PCIe 以太网芯片的规格以及在 Linux 中的驱动安装和配置方法。通过深入分析驱动源码,可以更好地理解其工作原理和优化方法。在实际应用中,合理配置和优化驱动程序可以显著提升网络性能和稳定性。希望本文能帮助您更好地使用和管理 RTL8125B,以满足各种网络应用需求。
1092 33
|
10月前
|
Unix Linux Shell
Linux新手入门手册
在Linux或类Unix系统中,掌握一系列基础命令和快捷键是提升工作效率的关键。这些工具和技巧不仅能帮助用户更高效地管理系统,还能在日常使用中带来极大的便利。以下是对这些基础操作与快捷键的详细解析大全。
196 9
|
10月前
|
数据管理 Linux iOS开发
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
269 0
Splunk Enterprise 9.4.1 (macOS, Linux, Windows) 发布 - 机器数据管理和分析
|
12月前
|
存储 运维 监控
Linux--深入理与解linux文件系统与日志文件分析
深入理解 Linux 文件系统和日志文件分析,对于系统管理员和运维工程师来说至关重要。文件系统管理涉及到文件的组织、存储和检索,而日志文件则记录了系统和应用的运行状态,是排查故障和维护系统的重要依据。通过掌握文件系统和日志文件的管理和分析技能,可以有效提升系统的稳定性和安全性。
291 7
|
12月前
|
监控 安全 Linux
启用Linux防火墙日志记录和分析功能
为iptables启用日志记录对于监控进出流量至关重要
408 1