zoukankan      html  css  js  c++  java
  • 第11月第20天 sqlite3_open xcode mysql connector

    1.

    sqlite3_open 死锁

    * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
    frame #0: 0x0000000116e22c22 libsystem_kernel.dylib`__psynch_mutexwait + 10
    frame #1: 0x0000000116e57dfa libsystem_pthread.dylib`_pthread_mutex_lock_wait + 100
    * frame #2: 0x000000010d550e3a MLPlayer`sqlite3Malloc [inlined] sqlite3_mutex_enter(p=<unavailable>) at sqlite3.c:21778 [opt]
    frame #3: 0x000000010d550e2f MLPlayer`sqlite3Malloc(n=127) at sqlite3.c:23035 [opt]
    frame #4: 0x000000010d55a7db MLPlayer`sqlite3DbMallocRaw(db=0x00007f9cf7617ed0, n=<unavailable>) at sqlite3.c:23374 [opt]
    frame #5: 0x000000010d559402 MLPlayer`sqlite3DbMallocZero(db=<unavailable>, n=127) at sqlite3.c:23318 [opt]
    frame #6: 0x000000010d59c943 MLPlayer`sqlite3FindCollSeq [inlined] findCollSeqEntry at sqlite3.c:92028 [opt]
    frame #7: 0x000000010d59c8f7 MLPlayer`sqlite3FindCollSeq(db=<unavailable>, enc=<unavailable>, zName=<unavailable>, create=<unavailable>) at sqlite3.c:92079 [opt]
    frame #8: 0x000000010d55ffe5 MLPlayer`createCollation(db=<unavailable>, zName=<unavailable>, enc=<unavailable>, pCtx=<unavailable>, xCompare=<unavailable>, xDel=<unavailable>) at sqlite3.c:124965 [opt]
    frame #9: 0x000000010d55f84b MLPlayer`openDatabase(zFilename="/Users/temp/Library/Developer/CoreSimulator/Devices/F31C98A5-1D5C-4053-B6E2-1E622E430721/data/Containers/Data/Application/CCAE5F2D-0E09-4EBE-866A-C89D4E59AD38/Documents/xx.db", ppDb=<unavailable>, flags=<unavailable>, zVfs=0x0000000000000000) at sqlite3.c:125438 [opt]
    frame #10: 0x000000010d0f82d8 MLPlayer`-[PAFMDatabase open](self=0x000060000008ece0, _cmd="open") at PAFMDatabase.m:144

    http://bbs.csdn.net/topics/370165256

    2. xcode mysql connector

    . 编译Connector/C(因为Connector/C++依赖Connector/C)
       解压缩源码, 比如释放到F盘, 并改名为mysqlc(纯粹为了方便说明)
       打开CMAKE-GUI(在安装目录里找), Source Path选择"F:mysqlc", Build Path选择"F:uildc"
       Build Path可以和Source Path一样
       点Configure, 选择编译器与平台, 点Finish, 出现"Configuring done"后点Generate
       出现"Generating done"后, CMAKE部分完事儿
       在"F:uildc"里找项目文件(sln), 打开, 编译(注意Debug与Release), C组件搞定

    http://blog.csdn.net/sidyhe/article/details/50845583

    http://mirrors.sohu.com/mysql/Connector-C/mysql-connector-c-6.1.6-src.tar.gz 

    3.

    ulong
    cli_safe_read_with_ok(MYSQL *mysql, my_bool parse_ok,
                          my_bool *is_data_packet)
    {
    ...
    if (net->read_pos[0] == 255)
      {
        /*
          After server reprts an error, usually it is ready to accept new commands and
          we set stage to READY_FOR_COMMAND. This can be modified by the caller of
          cli_safe_read().
        */
        MYSQL_TRACE_STAGE(mysql, READY_FOR_COMMAND);
    
        if (len > 3)
        {
          uchar *pos= net->read_pos+1;
          net->last_errno=uint2korr(pos);
          pos+=2;
          len-=2;
          if (protocol_41(mysql) && pos[0] == '#')
          {
        strmake(net->sqlstate, (char*)pos+1, SQLSTATE_LENGTH);
        pos+= SQLSTATE_LENGTH+1;
          }
          else
          {
            /*
              The SQL state hasn't been received -- it should be reset to HY000
              (unknown error sql state).
            */
    
            my_stpcpy(net->sqlstate, unknown_sqlstate);
          }
    
          (void) strmake(net->last_error,(char*) pos,
                 MY_MIN((uint) len,(uint) sizeof(net->last_error)-1));
        }
        else
          set_mysql_error(mysql, CR_UNKNOWN_ERROR, unknown_sqlstate);
        /*
          Cover a protocol design error: error packet does not
          contain the server status. Therefore, the client has no way
          to find out whether there are more result sets of
          a multiple-result-set statement pending. Luckily, in 5.0 an
          error always aborts execution of a statement, wherever it is
          a multi-statement or a stored procedure, so it should be
          safe to unconditionally turn off the flag here.
        */
        mysql->server_status&= ~SERVER_MORE_RESULTS_EXISTS;
    
        DBUG_PRINT("error",("Got error: %d/%s (%s)",
                            net->last_errno,
                            net->sqlstate,
                            net->last_error));
        return(packet_error);
      }

    (lldb) p net->buff

    (unsigned char *) $0 = 0x0000000101809000 "377zx04#42S02Table 'test.address_book_group_00' doesn't exist"

    (lldb) p net->buff[0]

    (unsigned char) $1 = 'xff'

    (lldb) p net->buff[1]

    (unsigned char) $2 = 'z'

    (lldb) p net->buff[2]

    (unsigned char) $3 = 'x04'

    (lldb) p net->buff[5]

    (unsigned char) $4 = '2'

    (lldb) p net->buff[6]

    (unsigned char) $5 = 'S'

    (lldb) p net->buff[7]

    (unsigned char) $6 = '0'

    (lldb) p net->buff[8]

    (unsigned char) $7 = '2'

    (lldb) p net->buff[9]

    (unsigned char) $8 = 'T'

    (lldb) p net->buff[10]

    (unsigned char) $9 = 'a'

    (lldb) p net->buff[11]

    (unsigned char) $10 = 'b'

    (lldb) p net->buff[12]

    (unsigned char) $11 = 'l'

    (lldb) p net->buff[13]

    (unsigned char) $12 = 'e'

    (lldb) p pos

    (uchar *) $13 = 0x0000000101809003 "#42S02Table 'test.address_book_group_00' doesn't exist"

    (lldb) p pos

    (uchar *) $14 = 0x0000000101809009 "Table 'test.address_book_group_00' doesn't exist"

    cli_read_query_result: error: Got error: 1146/42S02 (Table 'test.address_book_group_00' doesn't exist)

     

    1146=0x47a=zx04  net->last_errno

     

    377=xff=255     net->read_pos[0] == 255

     

    42S02             net->sqlstate

     

    https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_basic_err_packet.html

    The Payload of an ERR Packet
    TypeNameDescription
    int<1> header 0xFF ERR packet header
    int<2> error_code error-code
    if capabilities & CLIENT_PROTOCOL_41 {
    string[1] sql_state_marker # marker of the SQL state
    string[5] sql_state SQL state
    }
    string<EOF> error_message human readable error message

     

    MYSQL * STDCALL
    CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
                   const char *passwd, const char *db,
                   uint port, const char *unix_socket,ulong client_flag)
    {
    ...
       pkt_end= (char*)net->read_pos + pkt_length;
      /* Check if version of protocol matches current one */
      mysql->protocol_version= net->read_pos[0];
      DBUG_DUMP("packet",(uchar*) net->read_pos,10);
      DBUG_PRINT("info",("mysql protocol version %d, server=%d",
                 PROTOCOL_VERSION, mysql->protocol_version));
      if (mysql->protocol_version != PROTOCOL_VERSION)
      {
        set_mysql_extended_error(mysql, CR_VERSION_ERROR, unknown_sqlstate,
                                 ER(CR_VERSION_ERROR), mysql->protocol_version,
                                 PROTOCOL_VERSION);
        goto error;
      }
      server_version_end= end= strend((char*) net->read_pos+1);
      mysql->thread_id=uint4korr((uchar*) end + 1);
      end+=5;
      /*
        Scramble is split into two parts because old clients do not understand
        long scrambles; here goes the first part.
      */
      scramble_data= end;
      scramble_data_len= AUTH_PLUGIN_DATA_PART_1_LENGTH + 1;
      scramble_plugin= NULL;
      end+= scramble_data_len;
    
      if (pkt_end >= end + 1)
        mysql->server_capabilities=uint2korr((uchar*) end);
      if (pkt_end >= end + 18)
      {
        /* New protocol with 16 bytes to describe server characteristics */
        mysql->server_language=end[2];
        mysql->server_status=uint2korr((uchar*) end + 3);
        mysql->server_capabilities|= uint2korr((uchar*) end + 5) << 16;
        pkt_scramble_len= end[7];
        if (pkt_scramble_len < 0)
        {
          set_mysql_error(mysql, CR_MALFORMED_PACKET,
                          unknown_sqlstate);        /* purecov: inspected */
          goto error;
        }
      }
    ...
      /*
        Part 2: invoke the plugin to send the authentication data to the server
      */
    
      if (run_plugin_auth(mysql, scramble_buffer, scramble_data_len,
                          scramble_plugin, db))
        goto error;

    (lldb) p net->read_pos

    (unsigned char *) $0 = 0x0000000101009e00 " 5.6.21"

     

    ' '=PROTOCOL_VERSION(10)  mysql->protocol_version

     4.

    MYSQL_DATA *cli_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
                  unsigned int fields)
    ...
    
      while (*(cp=net->read_pos) == 0 || is_data_packet)
      {
        result->rows++;
        if (!(cur= (MYSQL_ROWS*) alloc_root(&result->alloc,
                        sizeof(MYSQL_ROWS))) ||
        !(cur->data= ((MYSQL_ROW)
                  alloc_root(&result->alloc,
                     (fields+1)*sizeof(char *)+pkt_len))))
        {
          free_rows(result);
          set_mysql_error(mysql, CR_OUT_OF_MEMORY, unknown_sqlstate);
          DBUG_RETURN(0);
        }
        *prev_ptr=cur;
        prev_ptr= &cur->next;
        to= (char*) (cur->data+fields+1);
        end_to=to+pkt_len-1;
        for (field=0 ; field < fields ; field++)
        {
          if ((len=(ulong) net_field_length(&cp)) == NULL_LENGTH)
          {                        /* null field */
        cur->data[field] = 0;
          }
          else
          {
        cur->data[field] = to;
            if (len > (ulong) (end_to - to))
            {
              free_rows(result);
              set_mysql_error(mysql, CR_MALFORMED_PACKET, unknown_sqlstate);
              DBUG_RETURN(0);
            }
        memcpy(to,(char*) cp,len); to[len]=0;
        to+=len+1;
        cp+=len;
        if (mysql_fields)
        {
          if (mysql_fields[field].max_length < len)
            mysql_fields[field].max_length=len;
        }
          }
        }
        cur->data[field]=to;            /* End of last field */
        if ((pkt_len= cli_safe_read(mysql, &is_data_packet)) == packet_error)
        {
          free_rows(result);
          DBUG_RETURN(0);
        }
      }

    (uchar *) cp = 0x0000000101805800 "x012x06aaaaaa"

    (char *) to = 0x0000000101802840 "2"

    (lldb) p len

    (ulong) $0 = 1

    (char *) to = 0x0000000101802842 "aaaaaa"

    (lldb) p len

    (ulong) $1 = 6

    (uchar *) cp = 0x000000010280b400 "x0222x06aaaaaa"


     

     

     

     

     

     

  • 相关阅读:
    【个人博客设计】
    复杂多边形光栅化算法
    xmake 描述语法和作用域详解
    协程分析之context上下文切换
    tbox协程使用之切换与等待
    记boost协程切换bug发现和分析
    跨平台自动构建工具v1.0.2 发布
    xmake从入门到精通9:交叉编译详解
    xmake从入门到精通9:交叉编译详解
    跨平台c开发库tbox:内存库使用详解
  • 原文地址:https://www.cnblogs.com/javastart/p/7398805.html
Copyright © 2011-2022 走看看