September 17, 2012

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

基本参考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 = […]