GDB除錯MySQL
GDB主要幫助我們完成下面四個方面的功能:
1、啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。
2、可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)
3、當程式被停住時,可以檢查此時你的程式中所發生的事。
4、你可以改變你的程式,將一個BUG產生的影響修正從而測試其他BUG。
在學習Oracle的時候使用GDB除錯,主要是關於學習Oracle的閂鎖原理,那麼,為什麼要用GDB除錯MySQL:
1.識別故障
2.場景重現
3.建立測試案例確認BUG
4.定位缺陷根源
5.測試和建立補丁修復BUG
下面開始學習GDB除錯MySQL
1、安裝編譯MySQL需要的軟體包
yum install -y cmake make gcc gcc-c++ ncurses-devel bison gdb
2、編譯MySQL
# git clone https://github.com/mysql/mysql-server.git
# cd mysql-server
# git checkout mysql-5.7.19
# cd BUILD; cmake .. -DDOWNLOAD_BOOST=1 -DWITH_DEBUG=1 -DWITH_UNIT_TESTS=off
# make
# make install
3、連線MySQL程式
3.1、檢視MySQL程式ID
[root@debug ~]# ps -ef | grep mysql
root 24589 1 0 07:58 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –user=mysql
mysql 24794 24589 0 07:58 ? 00:00:01 /usr/local/mysql/bin/mysqld –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –plugin-dir=/usr/local/mysql/lib/plugin –user=mysql –log-error=/usr/local/mysql/data/mysql-debug.log –pid-file=debug.pid –socket=/tmp/mysql.sock –port=3306
root 25009 24993 0 11:29 pts/2 00:00:00 grep mysql
|
3.2、GDB使用attach連線MySQL程式ID
[root@debug ~]# gdb
GNU gdb (GDB) Red Hat Enterprise Linux (7.2-92.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type “show copying”
and “show warranty” for details.
This GDB was configured as “x86_64-redhat-linux-gnu”.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) attach 24794
Attaching to process 24794
Reading symbols from /usr/local/mysql/bin/mysqld…done.
Reading symbols from /lib64/libpthread.so.0…(no debugging symbols found)…done.
[New LWP 24969]
[New LWP 24824]
[New LWP 24821]
[New LWP 24820]
[New LWP 24819]
[New LWP 24818]
[New LWP 24817]
[New LWP 24816]
[New LWP 24815]
[New LWP 24814]
[New LWP 24813]
[New LWP 24812]
[New LWP 24811]
[New LWP 24810]
[New LWP 24809]
[New LWP 24808]
[New LWP 24806]
[New LWP 24805]
[New LWP 24804]
[New LWP 24803]
[New LWP 24802]
[New LWP 24801]
[New LWP 24800]
[New LWP 24799]
[New LWP 24798]
[New LWP 24797]
[New LWP 24796]
[New LWP 24795]
[Thread debugging using libthread_db enabled]
Loaded symbols for /lib64/libpthread.so.0
Reading symbols from /lib64/libcrypt.so.1…(no debugging symbols found)…done.
Loaded symbols for /lib64/libcrypt.so.1
Reading symbols from /lib64/libdl.so.2…(no debugging symbols found)…done.
Loaded symbols for /lib64/libdl.so.2
Reading symbols from /lib64/librt.so.1…(no debugging symbols found)…done.
Loaded symbols for /lib64/librt.so.1
Reading symbols from /usr/lib64/libstdc++.so.6…(no debugging symbols found)…done.
Loaded symbols for /usr/lib64/libstdc++.so.6
Reading symbols from /lib64/libm.so.6…(no debugging symbols found)…done.
Loaded symbols for /lib64/libm.so.6
Reading symbols from /lib64/libgcc_s.so.1…(no debugging symbols found)…done.
Loaded symbols for /lib64/libgcc_s.so.1
Reading symbols from /lib64/libc.so.6…(no debugging symbols found)…done.
Loaded symbols for /lib64/libc.so.6
Reading symbols from /lib64/ld-linux-x86-64.so.2…(no debugging symbols found)…done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /lib64/libfreebl3.so…(no debugging symbols found)…done.
Loaded symbols for /lib64/libfreebl3.so
Reading symbols from /lib64/libnss_files.so.2…(no debugging symbols found)…done.
Loaded symbols for /lib64/libnss_files.so.2
0x00007f8801dfd383 in poll () from /lib64/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.209.el6_9.2.x86_64 libgcc-4.4.7-18.el6.x86_64 libstdc++-4.4.7-18.el6.x86_64 nss-softokn-freebl-3.14.3-23.el6_7.x86_64
|
4、設定斷點
4.1、檢視插入語句的原始碼sql_insert.cc的423行的函式Sql_cmd_insert::mysql_insert
bool Sql_cmd_insert::mysql_insert(THD *thd,TABLE_LIST *table_list)
{
DBUG_ENTER(“mysql_insert”);
LEX *const lex= thd->lex;
int error, res;
bool err= true;
bool transactional_table, joins_freed= FALSE;
bool changed;
bool is_locked= false;
ulong counter= 0;
ulonglong id;
|
4.2、在session1中的gdb設定insert的斷點
(gdb) b Sql_cmd_insert::mysql_insert
Breakpoint 1 at 0x17bd1b9: file /root/mysql-server/sql/sql_insert.cc, line 423.
|
4.3、檢視斷點資訊,從下往上看,使用到了多個MySQL函式。
(gdb) bt
#0 0x00007f8801dfd383 in poll () from /lib64/libc.so.6
#1 0x00000000016c1155 in Mysqld_socket_listener::listen_for_connection_event (this=0x45d8870)
at /root/mysql-server/sql/conn_handler/socket_connection.cc:852
#2 0x0000000000ece89c in Connection_acceptor<Mysqld_socket_listener>::connection_event_loop (this=0x45b5ec0)
at /root/mysql-server/sql/conn_handler/connection_acceptor.h:66
#3 0x0000000000ec6226 in mysqld_main (argc=17, argv=0x3ab4248) at /root/mysql-server/sql/mysqld.cc:5045
#4 0x0000000000ebd2d4 in main (argc=9, argv=0x7fffb2aa7408) at /root/mysql-server/sql/main.cc:25
|
4.4、在設定了斷點之後,在另一個session2中登入資料庫,發現無法登入,hung住了,在gdb中執行next(執行下一步程式碼),可以看到在socket_connection.cc原始碼第859行無法繼續,程式碼大致是說要獲取系統的socket,還有一些監聽資訊,由於太多了,直接在gdb中執行continue(到下一個可執行的程式碼),此時session2已經登入成功。
(gdb) n
Single stepping until exit from function poll,
which has no line number information.
Mysqld_socket_listener::listen_for_connection_event (this=0x45d8870) at /root/mysql-server/sql/conn_handler/socket_connection.cc:859
859 if (retval < 0 && socket_errno != SOCKET_EINTR)
(gdb) n
871 if (retval < 0 || abort_loop)
(gdb) n
876 MYSQL_SOCKET listen_sock= MYSQL_INVALID_SOCKET;
(gdb) n
877 bool is_unix_socket= false;
(gdb) n
879 for (uint i= 0; i < m_socket_map.size(); ++i)
(gdb) n
881 if (m_poll_info.m_fds[i].revents & POLLIN)
(gdb) n
879 for (uint i= 0; i < m_socket_map.size(); ++i)
(gdb) n
881 if (m_poll_info.m_fds[i].revents & POLLIN)
(gdb) n
883 listen_sock= m_poll_info.m_pfs_fds[i];
(gdb) n
884 is_unix_socket= m_socket_map[listen_sock];
(gdb) n
885 break;
(gdb) n
904 for (uint retry= 0; retry < MAX_ACCEPT_RETRY; retry++)
(gdb) n
906 socket_len_t length= sizeof(struct sockaddr_storage);
(gdb) n
908 (struct sockaddr *)(&cAddr), &length);
(gdb) n
909 if (mysql_socket_getfd(connect_sock) != INVALID_SOCKET ||
(gdb) n
… …
(gdb) c
Continuing.
|
4.5、session2此時的select操作都是一切正常的
[root@localhost:(none)][11:41:15am] MySQL-> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
[root@localhost:test][11:49:12am] MySQL-> show tables;
+—————-+
| Tables_in_test |
+—————-+
| t |
| t1 |
+—————-+
2 rows in set (0.00 sec)
[root@localhost:test][11:49:16am] MySQL-> select * from t;
+——+——+
| id | name |
+——+——+
| 1 | aaa |
| 2 | aaa |
| 3 | aaa |
| 4 | aaa |
+——+——+
4 rows in set (0.00 sec)
|
4.6、session2做insert操作的時候,又一次hung住了,session1列印出了斷點的資訊,在mysql_insert:423行,直到執行continue,session2才能正常插入資料。
(gdb) c
Continuing.
[Switching to Thread 0x7f87e00b4700 (LWP 24824)]
Breakpoint 1, Sql_cmd_insert::mysql_insert (this=0x7f87f40147b8, thd=0x7f87f401bc60, table_list=0x7f87f4013fe0)
at /root/mysql-server/sql/sql_insert.cc:423
423 DBUG_ENTER(“mysql_insert”);
(gdb) n
425 LEX *const lex= thd->lex;
(gdb) n
427 bool err= true;
(gdb) c
Continuing.
|
相關文章
- 使用gdb編譯除錯mysql編譯除錯MySql
- gdb除錯除錯
- gdb除錯命令除錯
- GDB除錯指令除錯
- GDB 除錯程式碼除錯
- gdb除錯多程式除錯
- GDB除錯彙總除錯
- 用GDB除錯程式除錯
- GDB多程式除錯除錯
- gdb除錯快速上手除錯
- gdb除錯多程序除錯
- gdb除錯總結除錯
- 介紹 GDB 除錯 Go除錯Go
- GDB除錯命令詳解除錯
- C語言——gdb除錯C語言除錯
- 用GDB除錯程式(六)除錯
- GDB除錯使用記錄除錯
- Codeblocks和gdb除錯BloC除錯
- linux 下GDB除錯Linux除錯
- gdb高階除錯方法高階除錯
- 使用 gdb 工具除錯 Go除錯Go
- gdb除錯coredump檔案除錯
- gdb高階除錯命令高階除錯
- C編譯: 使用gdb除錯編譯除錯
- Linux核心使用gdb除錯Linux除錯
- C 編譯: 使用 gdb 除錯編譯除錯
- GDB程式碼除錯與使用除錯
- 使用 GDB 除錯多程式程式除錯
- 用GDB除錯程式(二) (轉)除錯
- 用GDB除錯程式(四) (轉)除錯
- 用GDB除錯程式(三) (轉)除錯
- gdb除錯傳入引數除錯
- GDB 除錯 Mysql 實戰(一)原始碼編譯安裝除錯MySql原始碼編譯
- gdb除錯命令小結_與多檔案除錯_遠端除錯除錯
- Linux中使用GDB除錯程式Linux除錯
- GDB除錯基礎使用方法除錯
- OpenHarmony系統使用gdb除錯init除錯
- GDB多執行緒除錯分析執行緒除錯