E. 移植到其他系统 / E.1. 调试MySQL服务器 / E.1.1. 针对调试编译MySQL

如果你遇到一些非常明确的问题,你可以总是试着调试MySQL。要调试MySQL,你必须用--with-debug或--with-debug=full选项来配置MySQL。你可以检查MySQL是否是通过mysqld --help来和调试一起编译的。如果--debug标记和选项一起被列出了,你就可以调试了。在这种情况mysqladmin ver下把mysqld版本列成mysql ... --debug

如果你使用gccegcs,推荐的configure 行如下:

CC=gcc CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors \
   -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql \
   --with-debug --with-extra-charsets=complex

这避免了libstdc++库和C++异常(很多编译器在线程代码里有C++异常的问题)的问题,并编译了一个支持所有字符集的MySQL版本。

如果你怀疑内存溢出错误,你可以用--with-debug=full来配置MySQL,这会安装一个内存分配(SAFEMALLOC)检查器。可是,运行SAFEMALLOC是非常慢的,所以如果你遇到性能上的问题,你应该 用--skip-safemalloc选项启动mysqld。这样禁止掉对调用malloc()和free()的内存检查。

当你用--with-debug编译mysqld时,如果它不再崩溃,你大致已经在MySQL内找到一个编译器缺陷或计时缺陷。这种情况下,你可以试着把-g加到上面的CFLAGSCXXFLAGS变量,并且不使用--with-debug。如果mysqld失败,你至少可以gdb用附着上它或使用核心文件上的gdb去找出发生什么问题。

当你为调试配置MySQL时,你就自动允许许多额外的监视mysqld健康的安全检查函数。如果它们发现一些“不期望”的事,会写一个条目到stderr,safe_mysqld指引这个stderr到错误日志!这也意味着如果MySQL发生什么意外的问题,并且你正使用一个源文件发布版本,那么你要做的第一件事就是去为调试配置MySQL!(第二件事是发邮件到MySQL邮件列表请求帮助)。请参阅1.7.1.1节,“MySQL邮件列表”。请根据你使用的MySQL版本对所有缺陷报告或问题使用mysqlbug脚本!

在Windows MySQL发布包里,mysqld.exe默认编译为支持追踪文件。