ALT Linux Team development discussions
 help / color / mirror / Atom feed
From: Alexey Tourbin <at@altlinux.ru>
To: ALT Devel discussion list <devel@lists.altlinux.org>
Subject: [devel] debug MySQL SEGV
Date: Sat, 26 Aug 2006 22:48:48 +0400
Message-ID: <20060826184848.GQ9658@localhost.localdomain> (raw)
In-Reply-To: <20060826144306.GN9658@localhost.localdomain>

[-- Attachment #1: Type: text/plain, Size: 9041 bytes --]

On Sat, Aug 26, 2006 at 06:43:06PM +0400, Alexey Tourbin wrote:
> On Sat, Aug 26, 2006 at 06:17:31PM +0400, Alexey Tourbin wrote:
> > > интересно, а что скажет abi-drift?
> > Он вроде заглох послденее время.  message size >1M.
> 
> Впрочем, abi_drift проверят только разрешимость символов.  То есть с
> abi_drift можно спрашивать, когда приложение падает по undefined symbol.
> Здесь что-то более тонкое.  Я попробовал в gdb расковырять но там
> сплошные callback'и, в общем боюсь что мне слабо такое расковырять.
> Но попробую ещё...

gdb не помогает. :(  Поэтому я выбрал другую тактику, и у меня появилось
обоснованное подозрение.  Изложу подробно, как я реализую эту тактику;
это может быть назидательным для других maintainer'ов.

Тактика состоит в том, чтобы проверить, *что именно* мы компилируем.
Сначала стивится libMySQL-devel 5.0.22 и делается gcc -E всех
компилируемых файлов (препроцессор).  Потом ставится libMySQL-devel
5.0.24 и опять делается gcc -E всех комплируемых файлов.  Потом на
раскрытые таким образом исходники сравниваются.

$ cd ~build/DBD-mysql-3.0006
$ rm -fv *.o
removed `dbdimp.o'
removed `mysql.o'
$ sudo rpm -Uv ~sisyphus/files/i586/RPMS/libMySQL*-5.0.22-alt1.i586.rpm --force --nodeps
Preparing packages for installation...             
libMySQL-5.0.22-alt1
libMySQL-devel-5.0.22-alt1
$

Поставил старые пакеты libMySQL.  Теперь нужно зопатчить Makefile,
чтобы вместо gcc -c выполнялся gcc -E.

$ diff Makefile{-,}
--- Makefile-   2006-08-26 14:21:28 +0000
+++ Makefile    2006-08-26 18:26:45 +0000
@@ -309,7 +309,7 @@ BSLOADLIBS = 
 
 
 # --- MakeMaker const_cccmd section:
-CCCMD = $(CC) -c $(PASTHRU_INC) $(INC) \
+CCCMD = $(CC) -E $(PASTHRU_INC) $(INC) \
        $(CCFLAGS) $(OPTIMIZE) \
        $(PERLTYPE) $(MPOLLUTE) $(DEFINE_VERSION) \
        $(XS_DEFINE_VERSION)
$

Теперь при попытке комплияции .c.o в stdout будут сыпаться раскрытые
исходники.

$ make dbdimp.o |tail -5
SV *mysql_db_last_insert_id(SV *dbh, imp_dbh_t *imp_dbh,
        SV *catalog, SV *schema, SV *table, SV *field, SV *attr)
{
  return Perl_sv_2mortal(((PerlInterpreter *)pthread_getspecific((*Perl_Gthr_key_ptr(((void *)0))))), my_ulonglong2str(mysql_insert_id(&((imp_dbh_t*)imp_dbh)->mysql)));
}
$

Значит, вывод можно сохранять.

$ make dbdimp.o >dbdimp.E1
$ make mysql.o >mysql.E1
$ ls -l *.E1
-rw-r--r-- 1 at at 596132 Aug 26 22:30 dbdimp.E1
-rw-r--r-- 1 at at 608773 Aug 26 22:30 mysql.E1
$

Теперь осталось поставить новую библиотеку и опять сохранить вывод.

$ sudo rpm -Uv ~sisyphus/files/i586/RPMS/libMySQL*-5.0.24-alt1.i586.rpm                 
Preparing packages for installation...                                                                          
libMySQL-5.0.24-alt1
libMySQL-devel-5.0.24-alt1
$ make dbdimp.o >dbdimp.E2
$ make mysql.o >mysql.E2

А теперь -- то, ради чего всё делалось: сравниваем полностью раскрытые
исходники.

$ diff -upbB dbdimp.E[12]
--- dbdimp.E1   2006-08-26 18:30:07 +0000
+++ dbdimp.E2   2006-08-26 18:40:43 +0000
@@ -15290,7 +15290,8 @@ enum mysql_option
   MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
   MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
   MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
-  MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT
+  MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
+  MYSQL_OPT_SSL_VERIFY_SERVER_CERT
 };

 struct st_mysql_options {
@@ -15305,6 +15306,7 @@ struct st_mysql_options {
   char *ssl_ca;
   char *ssl_capath;
   char *ssl_cipher;
+  my_bool ssl_verify_server_cert;
   char *shared_memory_base_name;
   unsigned long max_allowed_packet;
   my_bool use_ssl;
@@ -15450,7 +15452,7 @@ typedef struct st_mysql_res {
   my_bool unbuffered_fetch_cancelled;
   const struct st_mysql_methods *methods;
 } MYSQL_RES;
-# 327 "/usr/include/mysql/mysql.h"
+# 329 "/usr/include/mysql/mysql.h"
 typedef struct st_mysql_manager
 {
   NET net;
@@ -15470,10 +15472,10 @@ typedef struct st_mysql_parameters
   unsigned long *p_max_allowed_packet;
   unsigned long *p_net_buffer_length;
 } MYSQL_PARAMETERS;
-# 357 "/usr/include/mysql/mysql.h"
+# 359 "/usr/include/mysql/mysql.h"
 int mysql_server_init(int argc, char **argv, char **groups);
 void mysql_server_end(void);
-# 371 "/usr/include/mysql/mysql.h"
+# 373 "/usr/include/mysql/mysql.h"
 MYSQL_PARAMETERS * mysql_get_parameters(void);


@@ -15515,6 +15517,7 @@ MYSQL * mysql_init(MYSQL *mysql);
 my_bool mysql_ssl_set(MYSQL *mysql, const char *key,
           const char *cert, const char *ca,
           const char *capath, const char *cipher);
+const char * mysql_get_ssl_cipher(MYSQL *mysql);
 my_bool mysql_change_user(MYSQL *mysql, const char *user,
        const char *passwd, const char *db);
 MYSQL * mysql_real_connect(MYSQL *mysql, const char *host,
@@ -15664,13 +15667,13 @@ int mysql_manager_fetch_line(MYSQL_MANAG
         char* res_buf,
        int res_buf_size);
 my_bool mysql_read_query_result(MYSQL *mysql);
-# 569 "/usr/include/mysql/mysql.h"
+# 572 "/usr/include/mysql/mysql.h"
 enum enum_mysql_stmt_state
 {
   MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE,
   MYSQL_STMT_FETCH_DONE
 };
-# 639 "/usr/include/mysql/mysql.h"
+# 642 "/usr/include/mysql/mysql.h"
 typedef struct st_mysql_bind
 {
   unsigned long *length;
@@ -15844,7 +15847,7 @@ my_bool mysql_autocommit(MYSQL * mysql,
 my_bool mysql_more_results(MYSQL *mysql);
 int mysql_next_result(MYSQL *mysql);
 void mysql_close(MYSQL *sock);
-# 837 "/usr/include/mysql/mysql.h"
+# 840 "/usr/include/mysql/mysql.h"
 unsigned long net_safe_read(MYSQL* mysql);
 # 22 "dbdimp.h" 2
 # 1 "/usr/include/mysql/mysqld_error.h" 1
/var/mail/at has mail!
$

И второй файл:

$ diff -upbB mysql.E[12]
--- mysql.E1    2006-08-26 18:30:19 +0000
+++ mysql.E2    2006-08-26 18:40:47 +0000
@@ -15291,7 +15291,8 @@ enum mysql_option
   MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
   MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
   MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH,
-  MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT
+  MYSQL_REPORT_DATA_TRUNCATION, MYSQL_OPT_RECONNECT,
+  MYSQL_OPT_SSL_VERIFY_SERVER_CERT
 };

 struct st_mysql_options {
@@ -15306,6 +15307,7 @@ struct st_mysql_options {
   char *ssl_ca;
   char *ssl_capath;
   char *ssl_cipher;
+  my_bool ssl_verify_server_cert;
   char *shared_memory_base_name;
   unsigned long max_allowed_packet;
   my_bool use_ssl;
@@ -15451,7 +15453,7 @@ typedef struct st_mysql_res {
   my_bool unbuffered_fetch_cancelled;
   const struct st_mysql_methods *methods;
 } MYSQL_RES;
-# 327 "/usr/include/mysql/mysql.h"
+# 329 "/usr/include/mysql/mysql.h"
 typedef struct st_mysql_manager
 {
   NET net;
@@ -15471,10 +15473,10 @@ typedef struct st_mysql_parameters
   unsigned long *p_max_allowed_packet;
   unsigned long *p_net_buffer_length;
 } MYSQL_PARAMETERS;
-# 357 "/usr/include/mysql/mysql.h"
+# 359 "/usr/include/mysql/mysql.h"
 int mysql_server_init(int argc, char **argv, char **groups);
 void mysql_server_end(void);
-# 371 "/usr/include/mysql/mysql.h"
+# 373 "/usr/include/mysql/mysql.h"
 MYSQL_PARAMETERS * mysql_get_parameters(void);


@@ -15516,6 +15518,7 @@ MYSQL * mysql_init(MYSQL *mysql);
 my_bool mysql_ssl_set(MYSQL *mysql, const char *key,
           const char *cert, const char *ca,
           const char *capath, const char *cipher);
+const char * mysql_get_ssl_cipher(MYSQL *mysql);
 my_bool mysql_change_user(MYSQL *mysql, const char *user,
        const char *passwd, const char *db);
 MYSQL * mysql_real_connect(MYSQL *mysql, const char *host,
@@ -15665,13 +15668,13 @@ int mysql_manager_fetch_line(MYSQL_MANAG
         char* res_buf,
        int res_buf_size);
 my_bool mysql_read_query_result(MYSQL *mysql);
-# 569 "/usr/include/mysql/mysql.h"
+# 572 "/usr/include/mysql/mysql.h"
 enum enum_mysql_stmt_state
 {
   MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE,
   MYSQL_STMT_FETCH_DONE
 };
-# 639 "/usr/include/mysql/mysql.h"
+# 642 "/usr/include/mysql/mysql.h"
 typedef struct st_mysql_bind
 {
   unsigned long *length;
@@ -15845,7 +15848,7 @@ my_bool mysql_autocommit(MYSQL * mysql,
 my_bool mysql_more_results(MYSQL *mysql);
 int mysql_next_result(MYSQL *mysql);
 void mysql_close(MYSQL *sock);
-# 837 "/usr/include/mysql/mysql.h"
+# 840 "/usr/include/mysql/mysql.h"
 unsigned long net_safe_read(MYSQL* mysql);
 # 22 "dbdimp.h" 2
 # 1 "/usr/include/mysql/mysqld_error.h" 1
$

Глядя на diff, *единственное*, что приходит в голову -- это изменение
в структуре st_mysql_options.  Прямо посреди структуры добавилось новое
поле.  Если эта структура каким-либо косвенным образом экспозируется
в качестве API, тогда это объясняет сбои в работе.  Это и есть то
обоснованное подозрение, о котором я написал в начале.

Теперь классический вопрос: что делать?

[-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --]

  reply	other threads:[~2006-08-26 18:48 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-08-26  9:22 [devel] python-module-MySQLdb требует пересборки? Eugene Vlasov
2006-08-26 11:14 ` Konstantin A. Lepikhov
2006-08-26 13:57 ` Alexey Tourbin
2006-08-26 14:09   ` Konstantin A. Lepikhov
2006-08-26 14:17     ` Alexey Tourbin
2006-08-26 14:43       ` Alexey Tourbin
2006-08-26 18:48         ` Alexey Tourbin [this message]
2006-08-26 19:22           ` [devel] debug MySQL SEGV Sergey Vlasov
2006-08-26 19:29             ` Konstantin A. Lepikhov
2006-08-26 20:22             ` Konstantin A. Lepikhov
2006-08-26 20:34               ` Alexey Tourbin
2006-08-27  7:03                 ` Денис Смирнов
2006-08-27 12:37                   ` Alexey Tourbin
2006-08-27 12:46                     ` Денис Смирнов
2006-08-31 21:51                 ` Alexey Tourbin
2006-08-29 23:55             ` Michael Shigorin
2006-08-30  5:49               ` Alexey Rusakov
2006-09-02 13:22                 ` Michael Shigorin
2006-09-02 13:41                   ` [devel] [jt] " Dmitry V. Levin
2006-09-02 14:36               ` [devel] " Alexey Tourbin
2006-08-26 19:15         ` [devel] python-module-MySQLdb требует пересборки? Konstantin A. Lepikhov
2006-08-26 19:27           ` Alexey Tourbin
2006-08-26 18:47   ` Vitaly Lipatov
2006-08-26 17:30 ` Ivan Fedorov
2006-08-26 17:49   ` Alexey Tourbin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060826184848.GQ9658@localhost.localdomain \
    --to=at@altlinux.ru \
    --cc=devel@lists.altlinux.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

ALT Linux Team development discussions

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
		devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
	public-inbox-index devel

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.devel


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git