linux打印mysql堆栈_第25问:MySQL 崩溃了,打印了一些堆栈信息,怎么读?

本文介绍当MySQL未开启coredump功能时,仅凭errorlog中的堆栈信息进行故障定位的方法。通过GDB工具,结合具体崩溃位置,成功定位到相关代码,为开发人员提供了明确的修复方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

51f31abe7c0b68f9e85a1196afebaea8.png

问题

在09 问中,我们开启了 coredump 功能,在 MySQL 崩溃时获得了有用的 coredump 信息。

那如果没开启 coredump,仅有 error log 中的堆栈信息,我们如何分析有效的信息?

实验

我们沿用09 问中的 MySQL 崩溃的场景,此处忽略复现崩溃的步骤,大家参看09 问查看 error log:

3e3cbe8a8e99ec3d3fed30063b072f3e.png

我们拿到了崩溃位置 0xee36f1,如何找到与之相对的代码位置呢?找台测试机,获取对应版本的安装包:

62ea1da68632a3a83ebb263c5f08d680.png

解压:

300dc81ab22d866b2ec6a7eb9eb8fd08.png

然后用 GDB 打开 mysqld:

e48bec17bc7cceeffff79a3896d27cfc.png

在 0xee36f1 位置打一个断点:

1036da2059d74aea2b9dc87d99105383.png

我们可以看到,gdb 将崩溃位置的文件名和行号都打印出来,剩下的事情,就可以交给开发工程师,按照这个崩溃堆栈来进行问题排查。

赠送章节

21e63b7bc5434274dc14cdcbd3fb4f7d.png

红框内的这串信息是什么?我们来解开看一下,这段信息分为两段,"+0x71" 是一个偏移量,前面是一串文字,我们将文字解析出来:

758a06f6e760fea638eeaef8943c7798.png

可以看到前面这串文字是一个函数签名的编码,用 c++filt 还原编码以后,可以看到完整的函数签名。红框内的这串信息的意思就是崩溃位置是 一个函数起始位置 + 偏移量。我们大概可以猜到,这个 MySQL 的缺陷是在为 binlog 产生新的文件名时发生的。

小贴士:

函数起始位置 + 偏移量 是一种内存位置的表示方法,但该位置不一定是这个函数内的代码。

以本例来说,0xee36f1 这个位置,程序找到了就近的函数 generate_new_name 的起始位置,计算出有 0x71 这么多偏移,就表示成了 generate_new_name+0x71 这种形式。

f5ebe4cd76a963ec8cb0790f6ef09ced.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值