[MySQL 调试] 初试breakpad

breakpad是google开源的一个崩溃报告工具,按照其声称,生成的core file相当小,近日开始调研将其集成到我们线上MySQL的可行性,以下是初步的安装尝试

1. checkout 代码

svn co http://google-breakpad.googlecode.com/svn/trunk  breakpad

2. configure && make && make install

3.暴力cp src/client/linux/libbreakpad_client.a

4.测试程序

#include “client/linux/handler/exception_handler.h”
#include <cstdio>

static bool dumpCallback(const google_breakpad::MinidumpDescriptor &md,
void* context,
bool succeeded)
{
printf(“Dump path: %s\n”, md.path());
return succeeded;
}

void crash()
{
volatile int* a = (int*)(NULL);
*a = 1;
}

int main()
{
google_breakpad::MinidumpDescriptor md(“/tmp”);
google_breakpad::ExceptionHandler eh(md, NULL, dumpCallback, NULL, true, -1);
crash();
return 0;
}

 

g++ test.cc -o test -g  -I src/  -lbreakpad_client  -lpthread

$./test
Dump path: /tmp/19b5df9c-6935-3923-125a8f20-21844c05.dmp
Segmentation fault

 

breakpad包含了几个工具:

a.dump_syms用于产生程序的符号信息

dump_syms ./tesr  > test.sym

$dump_syms ./test  > test.sym
$head -n1 test.sym
MODULE Linux x86_64 CE30BAB82B8B4B73D3A169C97011971D0 test

 

mkdir -p ./symbols/test/CE30BAB82B8B4B73D3A169C97011971D0

mv test.sym ./symbols/test/CE30BAB82B8B4B73D3A169C97011971D0/

 

b.minidump_stackwalk  用于分析产生的dmp文件,输出堆栈,CPU,OS等信息

例如

$minidump_stackwalk  /tmp/19b5df9c-6935-3923-125a8f20-21844c05.dmp  ./symbols
2012-09-16 02:48:06: minidump_processor.cc:264: INFO: Processing minidump in file /tmp/19b5df9c-6935-3923-125a8f20-21844c05.dmp
2012-09-16 02:48:06: minidump.cc:3780: INFO: Minidump opened minidump /tmp/19b5df9c-6935-3923-125a8f20-21844c05.dmp
2012-09-16 02:48:06: minidump.cc:3825: INFO: Minidump not byte-swapping minidump
2012-09-16 02:48:06: minidump.cc:4191: INFO: GetStream: type 1197932545 not present
2012-09-16 02:48:06: minidump.cc:4191: INFO: GetStream: type 1197932546 not present
2012-09-16 02:48:06: minidump.cc:1959: INFO: MinidumpModule could not determine version for /u01/project/breakpad/test
2012-09-16 02:48:06: minidump.cc:1959: INFO: MinidumpModule could not determine version for /lib64/ld-2.12.so
2012-09-16 02:48:06: minidump.cc:1959: INFO: MinidumpModule could not determine version for /lib64/libc-2.12.so
2012-09-16 02:48:06: minidump.cc:1959: INFO: MinidumpModule could not determine version for /lib64/libpthread-2.12.so
2012-09-16 02:48:06: minidump.cc:1959: INFO: MinidumpModule could not determine version for /lib64/libm-2.12.so
2012-09-16 02:48:06: minidump.cc:1959: INFO: MinidumpModule could not determine version for /lib64/libgcc_s-4.4.5-20110214.so.1
2012-09-16 02:48:06: minidump.cc:1959: INFO: MinidumpModule could not determine version for /usr/lib64/libstdc++.so.6.0.13
2012-09-16 02:48:06: minidump.cc:1959: INFO: MinidumpModule could not determine version for linux-gate.so
2012-09-16 02:48:06: minidump_processor.cc:116: INFO: Minidump /tmp/19b5df9c-6935-3923-125a8f20-21844c05.dmp has CPU info, OS info, no Breakpad info, exception, module list, thread list, no dump thread, and requesting thread
2012-09-16 02:48:06: minidump_processor.cc:150: INFO: Looking at thread /tmp/19b5df9c-6935-3923-125a8f20-21844c05.dmp:0/1 id 0x2fbb
2012-09-16 02:48:06: minidump.cc:308: INFO: MinidumpContext: looks like AMD64 context
2012-09-16 02:48:06: minidump.cc:308: INFO: MinidumpContext: looks like AMD64 context
2012-09-16 02:48:06: source_line_resolver_base.cc:220: INFO: Loading symbols for module /u01/project/breakpad/test from memory buffer
2012-09-16 02:48:06: simple_symbol_supplier.cc:193: INFO: No symbol file at ./symbols/libc-2.12.so/3D56C84D4CA1C801848D81D06507EDFF0/libc-2.12.so.sym
2012-09-16 02:48:06: simple_symbol_supplier.cc:131: INFO: Cannot find symbol data buffer for module /lib64/libc-2.12.so
2012-09-16 02:48:06: basic_code_modules.cc:88: INFO: No module at 0x0
2012-09-16 02:48:06: basic_code_modules.cc:88: INFO: No module at 0x7fffbf45a5d8
2012-09-16 02:48:06: basic_code_modules.cc:88: INFO: No module at 0x100000000
2012-09-16 02:48:06: minidump_processor.cc:258: INFO: Processed /tmp/19b5df9c-6935-3923-125a8f20-21844c05.dmp
2012-09-16 02:48:06: minidump.cc:3752: INFO: Minidump closing minidump
Operating system: Linux
0.0.0 Linux 2.6.32-220.17.1.tb619.el6.x86_64 #1 SMP Fri Jun 8 13:48:13 CST 2012 x86_64
CPU: amd64
family 0 model 0 stepping 0
1 CPU

Crash reason:  SIGSEGV
Crash address: 0x0

Thread 0 (crashed)
0  test!crash [test.cc : 15 + 0x4]
rbx = 0x00007fffbf45a4b0   r12 = 0x00000000004015e0
r13 = 0x00007fffbf45a5d0   r14 = 0x0000000000000000
r15 = 0x0000000000000000   rip = 0x000000000040170d
rsp = 0x00007fffbf45a430   rbp = 0x00007fffbf45a430
Found by: given as instruction pointer in context
1  test!main [test.cc : 22 + 0x4]
rbx = 0x00007fffbf45a4b0   r12 = 0x00000000004015e0
r13 = 0x00007fffbf45a5d0   r14 = 0x0000000000000000
r15 = 0x0000000000000000   rip = 0x00000000004017fc
rsp = 0x00007fffbf45a440   rbp = 0x00007fffbf45a4f0
Found by: call frame info
2  libc-2.12.so + 0x1ec9c
rbx = 0x0000000000000000   r12 = 0x00000000004015e0
r13 = 0x00007fffbf45a5d0   r14 = 0x0000000000000000
r15 = 0x0000000000000000   rip = 0x000000388881ec9d
rsp = 0x00007fffbf45a500   rbp = 0x0000000000000000
Found by: call frame info
3  test!crash [test.cc : 16 + 0x1]
rip = 0x0000000000401715   rsp = 0x00007fffbf45a520
Found by: stack scanning

Loaded modules:
0x00400000 – 0x00410fff  test  ???  (main)
0x3888000000 – 0x388801ffff  ld-2.12.so  ???
0x3888800000 – 0x3888b8bfff  libc-2.12.so  ???
0x3888c00000 – 0x3888e18fff  libpthread-2.12.so  ???
0x3889400000 – 0x3889683fff  libm-2.12.so  ???
0x388b400000 – 0x388b615fff  libgcc_s-4.4.5-20110214.so.1  ???
0x388e400000 – 0x388e6f0fff  libstdc++.so.6.0.13  ???
0x7fffbf5ff000 – 0x7fffbf5fffff  linux-gate.so  ???

简单记录下,还在摸索阶段,下一步尝试将其合并到MySQL中,看看生成的core file大小是否可以接受。

时间: 2024-11-08 17:49:03

[MySQL 调试] 初试breakpad的相关文章

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

基本参考twitter的实现,代码很简单,直接调用的breakpad的接口,关键是修改cmake文件比较蛋疼. twitter的实现:https://github.com/twitter/mysql/commit/f95c5a49b4703779d05c200a9b282284248b7cb9 需要作部分修改,这里记录下我的操作步骤 1.下载google-breakpad,如果是在r1001之前的版本直接编译安装即可(未尝试),如果是checkout的最新版本,需要把源代码内的my_strchr

101个MySQL调试和优化技巧

  MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思路是通用的.我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中--在内存中访问文件时的速度要比在硬盘中访问时快的多. 2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬

[MySQL 调试] 编译mysqld缺少gb2312的问题

最近在安装Percona5.5.18版本MySQL时,发现字符集不全,编译参数如下 CFLAGS="-O3 -g -fno-exceptions -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing" CXX=gcc CXXFLAGS="-O3 -g -fno-exceptions -fno-rtti -static-libgcc -fno-omit-frame-pointer -fno-strict-alia

Python调用MySQL模块初试

学Python喊了很长时间了,总是因为各种各样的理由搁置,昨天想起来前同事推荐过一本Python的书<Python核心编程>第二版,就火速买了一本,Python的学习也算是个开始了.    当然了,我学习还是蛮浮躁的,总是喜欢循序渐进,深入浅出那种,希望短时间的学习能够看到成效,比如做出几个demo,写出几个算法之类的.    所以我把书先放下,换了个思路来想,如果我学习一门语言,怎么样会和目前的工作结合起来更多呢,bingo,那就调用MySQL吧.   其实mysql模块有点类似于JDBC的

MYSQL使用心得(十) 常用命令

mysql查看状态 ./mysqladmin -uroot -popen extended-status 然后grep进行shell编程 直接执行外部命令 ./mysql -uroot -e "show master status \G" 分析sql语句 explain <SQL>; explain partitions <SQL>; 查看表结构 desc 表名; 查看创建表的结构 show create table 表名; 查看变量(配置文件) show va

如何在Linux操作系统中安装MySQL数据库

首先打击我的就是rpm安装,它告诉我发现了Mysql版本冲突,安装无法继续.我用rpm -q 查询后,想 通过rpm -e 来删除系统自带的版本(3.x.x),但是rpm又无情的返回了一大堆其他的错误,由于和其他 软件的一些关联,那个3.x.x无法被删除.原先对rpm的美好感觉,就在这瞬间消失的无影无踪. "三人行,必有我师.",我立刻上MSN找到了alin,当我问他如何用rpm卸载mysql或者升 级时,这个家伙竟然幸灾乐祸的告诉我,他用那个 "Debian"只用

MySQL CMake参数说明手册

MySQL自5.5版本以后,就开始使用CMake编译工具了,因此,你在安装源文件中找不到configure文件是正常的.很多人下到了新版的MySQL,因为找不到configure文件,不知道该怎么继续下去.有没有一篇可供参考的文章呢?其实在http://forge.mysql.com网站上有一篇文章,专门介绍了如何用CMake工具进行新版MySQL的编译安装. 原文地址为:http://forge.mysql.com/wiki/Autotools_to_CMake_Transition_Guid

WordPress 全方位优化指南(上)

作为一个全面的 WordPress 性能优化教程,本文旨在帮助读者排查 WordPress 网站的性能问题,同时也提供网站前端优化加速的建议. 如果你曾经遇到过 WordPress 管理界面加载缓慢.「MySQL 服务器崩溃」.网页一直无法加载等情况,或者你预计网站的流量将要大涨,相信本教程会对你有益. 1. 查看网站前端性能指标 通常情况下,网站加载缓慢是由于网页规模过大引起的,而且现在的大多数网页,都包含许多图片.Flash.视频以及 JS 文件,这些元素都会给网络加载带宽造成压力,进而导页

MySQL UDF的调试方式 - debugview

debug|mysql MySQL UDF的调试方式 MySQL的UDF实质就是一个不需要设置入口点的动态连接库(*Nix称之为共享库).对于DLL的调试可谓个人有个法.现在我介绍一下一个非常简单的易用的调试方法.这一方法直接利用Windows API,语言无关.开发工具无关.项目类型无关,典型的三无调试方法.并且,我们从这里讨论的调试方法支持远程调试,对于一时无法掌握开发工具原本调试器而又急于寻找程序错误的朋友此方法非常实用! 首先我们需要下载接收端,当然有心人也可以自己写一个.在 http: