hiroshi hatake
cosmo****@gmail*****
2015年 1月 9日 (金) 01:41:28 JST
畑ケです。
気を取り直してデバッガを出動させました。
>
> ...
>> mysqld.exe!test_plugin_options()[sql_plugin.cc:3968]
> ここあたりのコードはこうなっていて、
>
> 3952 /*
> 3953 PLUGIN_VAR_STR command-line options without PLUGIN_VAR_MEMALLOC, point
> 3954 directly to values in the argv[] array. For plugins started at the
> 3955 server startup, argv[] array is allocated with load_defaults(), and
> 3956 freed when the server is shut down. But for plugins loaded with
> 3957 INSTALL PLUGIN, the memory allocated with load_defaults() is freed with
> 3958 freed() at the end of mysql_install_plugin(). Which means we cannot
> 3959 allow any pointers into that area.
> 3960 Thus, for all plugins loaded after the server was started,
> 3961 we copy string values to a plugin's memroot.
> 3962 */
> 3963 if (mysqld_server_started &&
> 3964 ((o->flags & (PLUGIN_VAR_STR | PLUGIN_VAR_NOCMDOPT |
> 3965 PLUGIN_VAR_MEMALLOC)) == PLUGIN_VAR_STR))
> 3966 {
> 3967 sysvar_str_t* str= (sysvar_str_t *)o;
> 3968 if (*str->value)
> 3969 *str->value= strdup_root(mem_root, *str->value);
> 3970 }
>
> ↓に
>
> 3964 ((o->flags & (PLUGIN_VAR_STR | PLUGIN_VAR_NOCMDOPT |
> 3965 PLUGIN_VAR_MEMALLOC)) == PLUGIN_VAR_STR))
>
> 該当しそうな条件のMroongaの変数は↓くらいなんですよねぇ。
>
> static MYSQL_SYSVAR_STR(default_wrapper_engine, mrn_default_wrapper_engine,
> PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_READONLY,
> "The default engine for wrapper mode",
> NULL,
> NULL,
> NULL);
>
> これ関連のコードをstorage/mroonga/ha_mroonga.ccから削除して
> ビルドすると直るか確認してもらえませんか?
Visual Studio のデバッガで追って確認してみました。
手順)
1. Visual Studioのデバッガでmysqldをアタッチ
2. mysqlクライアントにshare\mroonga\install.sqlを食べさせる。
すると、
> 3964 ((o->flags & (PLUGIN_VAR_STR | PLUGIN_VAR_NOCMDOPT |
> 3965 PLUGIN_VAR_MEMALLOC)) == PLUGIN_VAR_STR))
の箇所ではなく、
その前の箇所の、
> 3963 if (mysqld_server_started &&
> 3964 ((o->flags & (PLUGIN_VAR_STR | PLUGIN_VAR_NOCMDOPT |
> 3965 PLUGIN_VAR_MEMALLOC)) == PLUGIN_VAR_STR))
> 3966 {
> 3967 sysvar_str_t* str= (sysvar_str_t *)o;
> 3968 if (*str->value)
> 3969 *str->value= strdup_root(mem_root, *str->value);
> 3970 }
str->valueのチェックの、
> 3968 if (*str->value)
のstrがNULLで落ちていました。必ずこのifに到達すると異常終了します。
無理やりステップを進めると、
mysys\my_alloc.cの
432 char *strdup_root(MEM_ROOT *root, const char *str)
433 {
434 return strmake_root(root, str, strlen(str));
435 }
strがNULLになっていました。
- str 0x00000050 <文字列の文字の読み取り中にエラーが発生しまし
た。> const char *
あと、デバッガで追っていて気になったのが、
> 3950 st_mysql_sys_var *o= *opt;
この行は最適化により実行ファイルと対応する箇所が無くなっているようで、
ブレークポイントを置けませんでした…。
>> Mroongaを登録しようとしているところでmysqldが異常終了しているようで
>> す。。。
>> この問題を解決するのに他に必要そうな情報はありますか?
> 登録するSQLを1つずつ実行して具体的にどのSQLが原因かを調べる
> のがよさそうに思います。
>
> あとdataディレクトリーにgroonga.logというファイルがあると思
> うので、そこになにかないか確認した方がよい気がします。
>
ほか、tmp_root, tmp, argc, argvの異常終了した時点での値のダンプを添付し
ます。
~~~
他に役に立つかわからないですが、Ubuntuの場合も試してみたので報告します。
http://packages.groonga.org/nightly/mariadb-10.0.15-with-mroonga-4.09.2015.01.08.tar.gz
をUbuntu14.04.1 LTSでビルドし、share\mroonga\install.sqlを食べさせると、
今までwarningが出ていなかったと思いますが、
warningが出るようになってしまっています。
---
MariaDB [(none)]> source ../share/mroonga/install.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
---