コンピュータ / 2009/04/26 (Sun) / 編集 |
MySQLをGDBでデバッグしたい!
そのためには、ソースコードからコンパイルする必要があるわけで、そのコンパイル方法のメモ
注:「%」はコマンドを表しています。コマンドは改行無しで入力してください。
注:以下、緑色の字はコメントです、入力しないでね。
[2009/4/27]gdbからのattach方法まで追記
[2009/5/20]コンパイルオプションを[g -> g3]に変更
[2009/5/21]コピペミスを修正
そのためには、ソースコードからコンパイルする必要があるわけで、そのコンパイル方法のメモ
注:「%」はコマンドを表しています。コマンドは改行無しで入力してください。
注:以下、緑色の字はコメントです、入力しないでね。
[2009/4/27]gdbからのattach方法まで追記
[2009/5/20]コンパイルオプションを[g -> g3]に変更
[2009/5/21]コピペミスを修正
--------
ソースコードをダウンロード
%wget http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.1/mysql-5.1.34.zip
%unzip mysql-5.1.34.zip
%cd mysql-5.1.34
とりあえずshを起動、いくつかの環境変数を指定
%sh
%export CFLAGS="-g"
%export CFLAGS="-g3" g3の方がより細かい情報を取得できるらしい
%export CXX=gcc
%export CXXFLAGS="-g3 -felide-constructors -fno-exceptions -fno-rtti"
%export LDFLAGS="-L/usr/lib/"
今回大事なのは「GDBと連携」「日本語(UTF-8)を使えるようにする」の2つ。
%./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --enable-assembler --with-charset=utf8 --with-extra-charsets=all --with-debug=full
一応書いとくと
%make
エラーが出なかったらインストール
%make install
%groupadd mysql
%useradd mysql -g mysql
各種ファイルの権限を変更
%chown -R root /usr/local/mysql
%chown -R mysql /usr/local/mysql/var
%chown -R mysql /usr/local/mysql
パスが通っている場所にシンボリックリンクを貼る
%ln -s /usr/local/mysql/bin/mysqld_safe /usr/local/bin/mysqld_safe
%ln -s /usr/local/mysql/bin/mysqladmin /usr/local/bin/mysqladmin
%ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
mysqldの用意
libexec/mysqldとは別に、自動機同様のスクリプトを使う。
%cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
%chmod 755 /etc/rc.d/init.d/mysqld
設定ファイルをテンプレから作成。
cp support-files/my-medium.cnf /etc/my.cnf
設定ファイル「/etc/my.cnf」を微修正
[mysqld],[mysql],[mysqldump]に「default-character-set=utf8」を追加し、どこかにある「skip-federated」をコメントアウト(「"Manager of pid-file quit without updating file." 」と言われた時用)
コンパイル時に指定した通り、起動はユーザ「mysql」で行う
%sudo su - mysql
%/usr/local/mysql/bin/mysqld_safe &
初回はとりあえずrootパスワードの設定
%sudo mysqladmin -u root password NewPassword
debuginfo-install libgcc-4.3.2-7.i386
mysqldをgdbからの接続待ちモードで起動
%sudo su - mysql
%/usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --log-error=/usr/local/mysql/var/cls120.cs.ie.u-ryukyu.ac.jp.err --pid-file=/usr/local/mysql/var/ホスト名.pid --socket=/tmp/mysql.sock --port=3306 --gdb &
%exit
gdbからattach
%ps aux|grep mysql
%sudo gdb
(gdb) attach mysqldのプロセスID
もしくは
%ps aux|grep mysql
%sudo gdb -p プロセスID
どうやってgdbで追跡するかは調査中なのでそのうち追記
[Future's Laboratory 技術格納庫]MySQLをソースからインストール(RedHat9)
[tomoyamkungの日記][mysql]MySQL が "Manager of pid-file quit without updating file." と表示して起動しなくなった場合の対応
事前準備
とにもかくにも事前準備ソースコードをダウンロード
%wget http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.1/mysql-5.1.34.zip
%unzip mysql-5.1.34.zip
%cd mysql-5.1.34
とりあえずshを起動、いくつかの環境変数を指定
%sh
%export CXX=gcc
%export CXXFLAGS="-g3 -felide-constructors -fno-exceptions -fno-rtti"
%export LDFLAGS="-L/usr/lib/"
「ld: cannot find -lz」って言われちゃったときの話
ldがきちんとライブラリを認識していても上のエラーがでたりするらしい、それって認識できてないんじゃ、、、??
%ldconfig -p | grep libz
libz.so.1 (libc6) => /lib/libz.so.1
libz.so (libc6) => /usr/lib/libz.so
上のような結果だったのに「ld: cannot find -lz」って言われてしまった、しかたないのでコンパイルオプションに「-L/usr/lib/」を加える、そのための環境変数を設定しているのが「export LDFLAGS="-L/usr/lib/"」
configure
お次は大事なconfigure、コンパイルオプションは非常に大事なので熟考しましょう。今回大事なのは「GDBと連携」「日本語(UTF-8)を使えるようにする」の2つ。
%./configure --prefix=/usr/local/mysql --with-mysqld-user=mysql --enable-assembler --with-charset=utf8 --with-extra-charsets=all --with-debug=full
一応書いとくと
- --prefix=/usr/local/mysql インストール先は「/usr/local/mysql」
- --with-mysqld-user=mysql mysqldのユーザ名は「mysql」
- --enable-assembler アセンブラを有効
- --with-charset=utf8 文字コードはUTF-8
- --with-extra-charsets=all 他の文字コードもインストール
- --with-debug=full gdbでのdebugを有効
makeしてinstall
configureを実行するとMakefileが生成されてコンパイルの準備が整います%make
エラーが出なかったらインストール
%make install
設定
まずはMySQL用のユーザ、mysqlを作成%groupadd mysql
%useradd mysql -g mysql
各種ファイルの権限を変更
%chown -R root /usr/local/mysql
%chown -R mysql /usr/local/mysql/var
%chown -R mysql /usr/local/mysql
パスが通っている場所にシンボリックリンクを貼る
%ln -s /usr/local/mysql/bin/mysqld_safe /usr/local/bin/mysqld_safe
%ln -s /usr/local/mysql/bin/mysqladmin /usr/local/bin/mysqladmin
%ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql
mysqldの用意
libexec/mysqldとは別に、自動機同様のスクリプトを使う。
%cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
%chmod 755 /etc/rc.d/init.d/mysqld
設定ファイルをテンプレから作成。
cp support-files/my-medium.cnf /etc/my.cnf
設定ファイル「/etc/my.cnf」を微修正
[mysqld],[mysql],[mysqldump]に「default-character-set=utf8」を追加し、どこかにある「skip-federated」をコメントアウト(「"Manager of pid-file quit without updating file." 」と言われた時用)
起動
起動するコンパイル時に指定した通り、起動はユーザ「mysql」で行う
%sudo su - mysql
%/usr/local/mysql/bin/mysqld_safe &
初回はとりあえずrootパスワードの設定
%sudo mysqladmin -u root password NewPassword
gdbからのattach
とりあえず必要なライブラリをインストールdebuginfo-install libgcc-4.3.2-7.i386
mysqldをgdbからの接続待ちモードで起動
%sudo su - mysql
%/usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/var --log-error=/usr/local/mysql/var/cls120.cs.ie.u-ryukyu.ac.jp.err --pid-file=/usr/local/mysql/var/ホスト名.pid --socket=/tmp/mysql.sock --port=3306 --gdb &
%exit
gdbからattach
%ps aux|grep mysql
%sudo gdb
(gdb) attach mysqldのプロセスID
もしくは
%ps aux|grep mysql
%sudo gdb -p プロセスID
どうやってgdbで追跡するかは調査中なのでそのうち追記
参考
MySQL[Future's Laboratory 技術格納庫]MySQLをソースからインストール(RedHat9)
[tomoyamkungの日記][mysql]MySQL が "Manager of pid-file quit without updating file." と表示して起動しなくなった場合の対応
PR