[MySQL调试] 集成breakpad到MySQL内核

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

基本参考twitter的实现,代码很简单,直接调用的breakpad的接口,关键是修改cmake文件比较蛋疼。

twitter的实现:https://github.com/twitter/mysql/commit/f95c5a49b4703779d05c200a9b282284248b7cb9

需要作部分修改,这里记录下我的操作步骤

1.下载google-breakpad,如果是在r1001之前的版本直接编译安装即可(未尝试),如果是checkout的最新版本,需要把源代码内的my_strchr全部替换掉,俺直接替换成bp_my_strchr,这个会和mysql的定义冲突。

2.配置环境变量BREAKPAD_ROOT,不然breakpad是不会编译到MySQL中的:

$echo $BREAKPAD_ROOT
/u01/project/breakpad

3.configure && make && make install

4. backport twitter的patch

有点小不一样,在MySQL5.5.20之前的版本,调用函数my_write_minidump是在mysqld.cc的handle_segfault中,而在之后的版本中,为了解决bug#54082,这部分代码独立在单独文件sql/signal_handler.cc文件中,因此需要在函数handle_fatal_signal中调用my_write_minidump

cmake加上 -DENABLED_EMBEDDED_SERVER:BOOL=ON

5.用前几天report的一个bug尝试了一把,可以看到所有线程的堆栈/寄存器信息都被保存了下来,文件大小才629k。

通过minidump_stackwalk解析出来的部分内容如下:

Thread 34 (crashed)
0 mysqld!google_breakpad::ExceptionHandler::WriteMinidump [exception_handler.cc : 534 + 0xd]
rbx = 0x0000000000000000 r12 = 0x0000000000000000
r13 = 0x0000000000000000 r14 = 0x0000000000000080
r15 = 0x00007f0834008f10 rip = 0x0000000000991d3c
rsp = 0x00007f0891da4240 rbp = 0x00007f0891da4910
Found by: given as instruction pointer in context
1 mysqld!google_breakpad::ExceptionHandler::WriteMinidump [exception_handler.cc : 513 + 0x7]
rbx = 0x00007f0891da48b0 r12 = 0x0000000000000000
r13 = 0x0000000000000000 r14 = 0x0000000000000080
r15 = 0x00007f0834008f10 rip = 0x00000000009928ad
rsp = 0x00007f0891da48a0 rbp = 0x00007f0891da4910
Found by: call frame info
2 mysqld!my_write_minidump [minidump.cc : 71 + 0x21]
rbx = 0x0000000002af23d0 r12 = 0x00007f0891da497f
r13 = 0x00007f0891da4970 r14 = 0x0000000000000080
r15 = 0x00007f0834008f10 rip = 0x00000000006737dc
rsp = 0x00007f0891da4970 rbp = 0x00007f0891da49a0
Found by: call frame info
3 mysqld!handle_segfault [mysqld.cc : 2566 + 0xb]
rbx = 0x000000000000000b r12 = 0x000000000c57b6b0
r13 = 0x00000000009a167e r14 = 0x0000000000000080
r15 = 0x00007f0834008f10 rip = 0x000000000054e38a
rsp = 0x00007f0891da49b0 rbp = 0x00007f0891da4a30
Found by: call frame info
4 libpthread-2.12.so + 0xf51f
rbx = 0x0000000000008810 r12 = 0x0000000000000000
r13 = 0x0000000000000000 r14 = 0x00000000000000b0
r15 = 0x00007f0834008f10 rip = 0x0000003888c0f520
rsp = 0x00007f0891da4a40 rbp = 0x00007f0891da4f20
Found by: call frame info
5 mysqld!mi_state_info_read [mi_open.c : 958 + 0x2b]
rip = 0x00000000008d1954 rsp = 0x00007f0891da4af0
rbp = 0x00007f0891da4f20
Found by: stack scanning
6 mysqld!mi_open [mi_open.c : 210 + 0xf]
rbx = 0x0000000000000000 r12 = 0x00007f0891dae840
r13 = 0x00007f0891dadeb0 r14 = 0x00000000000000b0
rip = 0x00000000008d3832 rsp = 0x00007f0891da4f30
rbp = 0x00007f0891daeb50
Found by: call frame info
7 libc-2.12.so + 0x79adc
rip = 0x0000003888879add rsp = 0x00007f0891da4f70
rbp = 0x00007f0891daeb50
Found by: stack scanning
8 mysqld!my_malloc [my_malloc.c : 38 + 0x7]
rip = 0x000000000077c6e2 rsp = 0x00007f0891da4f90
rbp = 0x00007f0891daeb50
Found by: stack scanning
9 mysqld!my_strdup [my_malloc.c : 147 + 0xd]
rip = 0x000000000077c822 rsp = 0x00007f0891da4fc0
rbp = 0x00007f0891daeb50
Found by: stack scanning
10 mysqld!my_register_filename [mysql_thread.h : 671 + 0x7]
rip = 0x000000000077cfb0 rsp = 0x00007f0891da4ff0
rbp = 0x00007f0891daeb50
Found by: stack scanning

Thread 0
0 libc-2.12.so + 0xdd1e3
rbx = 0x0000000000000002 r12 = 0x000000000000003b
r13 = 0x0000000000000012 r14 = 0x00007fffb1eee56c
r15 = 0x000000000c5530c0 rip = 0x00000038888dd1e3
rsp = 0x00007fffb1eee400 rbp = 0x00007fffb1eee5a0
Found by: given as instruction pointer in context
1 mysqld!handle_connections_sockets [mysqld.cc : 5376 + 0x14]
rip = 0x000000000054eaa4 rsp = 0x00007fffb1eee430
rbp = 0x00007fffb1eee5a0
Found by: stack scanning
2 mysqld!mysqld_main [mysqld.cc : 4815 + 0x4]
rbx = 0x00007fffb1eee5c0 r12 = 0x0000000000000000
r13 = 0x00007fffb1eee6e0 r14 = 0x0000000000000000
r15 = 0x0000000000000000 rip = 0x0000000000551ee6
rsp = 0x00007fffb1eee5b0 rbp = 0x00007fffb1eee600
Found by: call frame info
3 libc-2.12.so + 0x1ec9c
rbx = 0x0000000000000000 r12 = 0x0000000000549340
r13 = 0x00007fffb1eee6e0 r14 = 0x0000000000000000
r15 = 0x0000000000000000 rip = 0x000000388881ec9d
rsp = 0x00007fffb1eee610 rbp = 0x0000000000000000
Found by: call frame info
4 mysqld + 0x14942f
rip = 0x0000000000549430 rsp = 0x00007fffb1eee630
Found by: stack scanning

……

……

……

Thread 37
0 libpthread-2.12.so + 0xb44c
rbx = 0x0000000001049b00 r12 = 0x0000000001048de0
r13 = 0x00000000009a4588 r14 = 0x0000000000000879
r15 = 0x0000000000000003 rip = 0x0000003888c0b44c
rsp = 0x00007f08902b5d48 rbp = 0x00007f08902b5df0
Found by: given as instruction pointer in context
1 mysqld!inline_mysql_cond_wait [mysql_thread.h : 980 + 0xa]
rip = 0x000000000054d093 rsp = 0x00007f08902b5d70
rbp = 0x00007f08902b5df0
Found by: stack scanning
2 mysqld!cache_thread [mysqld.cc : 2169 + 0x18]
rbx = 0x0000000000000001 r12 = 0x00007f08902b5e58
r13 = 0x00007f08902b69c0 r14 = 0x0000000000000000
r15 = 0x0000000000000003 rip = 0x000000000054e5d9
rsp = 0x00007f08902b5e00 rbp = 0x00007f08902b5e20
Found by: call frame info
3 mysqld!one_thread_per_connection_end [mysqld.cc : 2234 + 0x4]
rbx = 0x0000000000000001 r12 = 0x00007f08902b5e58
r13 = 0x00007f08902b69c0 r14 = 0x0000000000000000
r15 = 0x0000000000000003 rip = 0x000000000054e79d
rsp = 0x00007f08902b5e30 rbp = 0x00007f08902b5e40
Found by: call frame info
4 mysqld!do_handle_one_connection [sql_connect.cc : 1418 + 0x1f]
rbx = 0x0000000000000001 r12 = 0x00007f08902b5e58
r13 = 0x00007f08902b69c0 r14 = 0x0000000000000000
r15 = 0x0000000000000003 rip = 0x0000000000638b8c
rsp = 0x00007f08902b5e50 rbp = 0x00007f08902b5e70
Found by: call frame info
5 mysqld!handle_one_connection [sql_connect.cc : 1315 + 0x7]
rbx = 0x000000000c5b1ce0 r12 = 0x0000000001049420
r13 = 0x00007f08902b69c0 r14 = 0x0000000000000000
r15 = 0x0000000000000003 rip = 0x0000000000638c30
rsp = 0x00007f08902b5e80 rbp = 0x00007f08902b5e90
Found by: call frame info
6 libpthread-2.12.so + 0x77e0
rbx = 0x0000000000000000 r12 = 0x0000000001049420
r13 = 0x00007f08902b69c0 r14 = 0x0000000000000000
r15 = 0x0000000000000003 rip = 0x0000003888c077e1
rsp = 0x00007f08902b5ea0 rbp = 0x0000000000000000
Found by: call frame info

Loaded modules:
0x00400000 – 0x00d99fff mysqld ??? (main)
0x3888000000 – 0x388801ffff ld-2.12.so ???
0x3888400000 – 0x3888603fff libdl-2.12.so ???
0x3888800000 – 0x3888b8bfff libc-2.12.so ???
0x3888c00000 – 0x3888e18fff libpthread-2.12.so ???
0x3889400000 – 0x3889683fff libm-2.12.so ???
0x3889800000 – 0x3889a07fff librt-2.12.so ???
0x388b400000 – 0x388b615fff libgcc_s-4.4.5-20110214.so.1 ???
0x388bc00000 – 0x388be5dfff libfreebl3.so ???
0x388c400000 – 0x388c608fff libcrypt-2.12.so ???
0x388e400000 – 0x388e6f0fff libstdc++.so.6.0.13 ???
0x7fffb1fff000 – 0x7fffb1ffffff linux-gate.so ???

可以看到,保留的信息还是相当丰富,足以用于诊断问题,并且文件很小(629k),相应的core file则有6G。

———————————-


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4天前
|
SQL Java 流计算
Flink CDC在代码里面集成cdc的时候,是不是也要用上面这个胖包flink-sql-connector-mysql-cdc,不要去用瘦包flink-connector-mysql-cdc? com.ververica flink-sql-connector-mysql-cdc 2.4.0
Flink CDC在代码里面集成cdc的时候,是不是也要用上面这个胖包flink-sql-connector-mysql-cdc,不要去用瘦包flink-connector-mysql-cdc? com.ververica flink-sql-connector-mysql-cdc 2.4.0
52 1
|
4天前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之DataWorks集成实例绑定到同一个vpc下面,也添加了RDS的IP白名单报错:数据源配置有误,请检查,该怎么处理
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
29 0
|
4天前
|
分布式计算 DataWorks MaxCompute
DataWorks产品使用合集之在DataWorks中,将数据集成功能将AnalyticDB for MySQL中的数据实时同步到MaxCompute中如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
27 0
|
4天前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之在 DataWorks 中使用数据集成从 MySQL 导入数据到 GDB 执行同步任务脚本的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
29 0
|
4天前
|
缓存 Linux iOS开发
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南
76 1
|
4天前
|
关系型数据库 MySQL Java
IDEA+Mysql调试常见异常解决办法_kaic
IDEA+Mysql调试常见异常解决办法_kaic
|
4天前
|
SQL 存储 关系型数据库
Mysql内核查询成本计算
Mysql内核查询成本计算
|
4天前
|
DataWorks 关系型数据库 MySQL
DataWorks的数据集成实时同步mysql数据吗?
DataWorks的数据集成实时同步mysql数据吗?
122 0
|
4天前
|
DataWorks 关系型数据库 MySQL
DataWorks实时集成 mysql 默认的server_id范围是多少?
DataWorks实时集成 mysql 默认的server_id范围是多少?
103 0
|
4天前
|
关系型数据库 MySQL 数据库
docker MySQL删除数据库时的错误(errno: 39)
docker MySQL删除数据库时的错误(errno: 39)
25 0

推荐镜像

更多
http://www.vxiaotou.com