{"id":22599,"date":"2023-08-03T14:15:15","date_gmt":"2023-08-03T05:15:15","guid":{"rendered":"https:\/\/labs.gree.jp\/blog\/?p=22599"},"modified":"2023-08-03T14:08:49","modified_gmt":"2023-08-03T05:08:49","slug":"tracing-mysqlnd-so-with-perf-and-bpftrace","status":"publish","type":"post","link":"https:\/\/labs.gree.jp\/blog\/2023\/08\/22599\/","title":{"rendered":"Tracing mysqlnd.so and mysqld (with perf and bpftrace)"},"content":{"rendered":"<p>\u3053\u3093\u306b\u3061\u308f\u3002\u305b\u3058\u307e\u3067\u3059\u3002<\/p>\n<p>\u73fe\u4ee3\u4eba\u306fgdb\u3088\u308abpftrace\u3092\u597d\u3080\u3068\u3044\u3046\u96fb\u6ce2\u3092\u53d7\u4fe1\u3057\u305f\u306e\u3067\u3001<a href=\"https:\/\/labs.gree.jp\/blog\/2023\/07\/22581\/\">Debugging mysqlnd.so \uff5emysql_native_password\u304c\u5ec3\u6b62\u3055\u308c\u308b\u672a\u6765\u306b\u5099\u3048\u3066\uff5e<\/a>\u306e\u3088\u3046\u306a\u3053\u3068\u3092bpftrace\u306a\u3069\u3067\u78ba\u8a8d\u3057\u305f\u3044\u306a\u3089\u3069\u3046\u3057\u305f\u3089\u826f\u3044\u304b\u3001\u8a66\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<h2>\u306f\u3058\u3081\u306b<\/h2>\n<p>\u8eab\u3082\u84cb\u3082\u306a\u3044\u3067\u3059\u304c\u3001\u3053\u3046\u3044\u3063\u305f\u7528\u9014\u3067\u306fgdb\u306e\u65b9\u304c\u878d\u901a\u304c\u304d\u304f\u3068\u500b\u4eba\u7684\u306b\u306f\u601d\u3044\u307e\u3057\u305f\u3002uprobe\u3060\u3068\u3001\u30e6\u30fc\u30b6\u7a7a\u9593\u306e\u30ed\u30fc\u30ab\u30eb\u5909\u6570\u3067\u3001\u53c2\u7167\u3067\u304d\u308b\u3082\u306e\u3068\u3067\u304d\u306a\u3044\u3082\u306e\u304c\u307e\u3061\u307e\u3061\u3060\u3063\u305f\u306e\u3067\u3001\u4eca\u56de\u306f\u300clibcrypto\u306e\u95a2\u6570\u306b\u6e21\u3057\u3066\u308b\u5f15\u6570\u3092\u898b\u308c\u3070\u3044\u3044\u3060\u308d\u3046\u300d\u3068\u3044\u3046\u767a\u60f3\u306b\u81f3\u308a\u307e\u3057\u305f\u3002\u305d\u3053\u307e\u3067\u81f3\u308b\u306e\u306b\u3082\u6642\u9593\u3092\u8981\u3059\u308b\u306e\u3067\u3001\u3053\u3046\u3044\u3046\u9078\u629e\u80a2\u3082\u3042\u308b\u3068\u3044\u3046\u611f\u899a\u3067\u8aad\u3093\u3067\u3044\u305f\u3060\u3051\u308c\u3070\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u3067\u306f\u306f\u3058\u3081\u307e\u3059\u3002<\/p>\n<h2>perf probe \u3084 bpftrace \u3092\u8a66\u3059\u74b0\u5883\u306a\u3069<\/h2>\n<p>WSL2\u3060\u3068 <code>sudo ls \/sys\/kernel\/debug\/tracing<\/code> \u304c No such file or directory \u306a\u306e\u3067\u3001\u4eca\u56de\u306f\u7269\u7406\u30b5\u30fc\u30d0\u4e0a\u306e Ubuntu 20.04 LTS \u3067\u8a66\u3057\u307e\u3057\u305f\u3002\uff08WSL2\u4e0a\u3067\u3082bpftrace\u3067mysqld\u3092\u30c8\u30ec\u30fc\u30b9\u3057\u305f\u308a\u3067\u304d\u308b\u3093\u3067\u3059\u304c\u3001 perf\u306b\u3064\u3044\u3066\u306f\u3044\u3063\u305f\u3093WSL2\u3092\u907f\u3051\u3066\u8a66\u3057\u307e\u3059\u3002\uff09<\/p>\n<p>\u6b21\u306e\u3088\u3046\u306a\u74b0\u5883\u3067\u3059\u3002<\/p>\n<pre><code>$ lsb_release -a\nNo LSB modules are available.\nDistributor ID: Ubuntu\nDescription:    Ubuntu 20.04.6 LTS\nRelease:        20.04\nCodename:       focal\n$ uname -r\n5.4.0-155-generic\n$ perf --version\nperf version 5.4.235\n$ \n<\/code><\/pre>\n<p>\u8a66\u3057\u3066\u306a\u3044\u3067\u3059\u304c VM \u3067\u3082\u3044\u3051\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\uff08\u81ea\u5b85\u3067\u79c1\u7269\u306eWindows\u30de\u30b7\u30f3\u4e0a\u3067Hyper-V\u3067Ubuntu 22.04 LTS\u3044\u308c\u3066\u8a66\u3057\u305f\u9650\u308a\u3067\u306f\u3001 bpftrace \u3067 mysqld \u3092\u30c8\u30ec\u30fc\u30b9\u3059\u308b\u3068\u304b\u306f\u554f\u984c\u306a\u304f\u52d5\u304d\u307e\u3057\u305f\u3002\uff09<\/p>\n<h3>\u30c6\u30b9\u30c8\u74b0\u5883\u306eMySQL\u3001PHP\u306e\u691c\u8a3c\u7528\u30b9\u30af\u30ea\u30d7\u30c8\u3001PHP\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3001\uff08PHP\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\uff09\u3001Debug Symbol Package<\/h3>\n<p>\u3053\u306e\u3042\u305f\u308a\u306f<a href=\"https:\/\/labs.gree.jp\/blog\/2023\/07\/22581\/\">\u524d\u56de\u306e\u8a18\u4e8b<\/a>\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002<br \/>\n\u4eca\u56de\u306fPHP\u306e\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u306a\u304f\u3066\u3082\u3044\u3044\u3093\u3067\u3059\u304c\u3001\u5f8c\u307b\u3069\u51fa\u3066\u304f\u308b <code>perf probe -L<\/code> \u3092\u8a66\u3057\u305f\u3044\u306a\u3089\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3082\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<h3>libssl1.1-dbgsym \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n<p>\u8a73\u3057\u304f\u306f\u5f8c\u8ff0\u3057\u307e\u3059\u304c\u3001 mysqlnd.so \u3060\u3068\u53c2\u7167\u3067\u304d\u306a\u3044\u30ed\u30fc\u30ab\u30eb\u5909\u6570\u304c\u3042\u3063\u305f\u306e\u3067\u3001\u53d7\u3051\u53d6\u3063\u3066\u3044\u308b\u516c\u958b\u9375\u306e\u4e2d\u8eab\u3092\u78ba\u8a8d\u3059\u308b\u305f\u3081\u306b<\/p>\n<pre><code> $ sudo apt install libssl1.1-dbgsym\n<\/code><\/pre>\n<p>\u3057\u3066\u304a\u304d\u307e\u3059\u3002<\/p>\n<p>\u5f8c\u307b\u3069\u51fa\u3066\u304f\u308b <code>perf probe -L<\/code> \u3092\u8a66\u3057\u305f\u3044\u5834\u5408\u306f<\/p>\n<pre><code>$ apt-get source libssl1.1\n<\/code><\/pre>\n<p>\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<h3>perf \u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n<p><code>perf probe --add<\/code> \u3057\u305f\u3044\u306e\u3067<\/p>\n<pre><code> $ sudo apt install linux-tools-common linux-tools-`uname -r`\n<\/code><\/pre>\n<p>\u3057\u307e\u3059\u3002<\/p>\n<h2>probe point \u306e\u8ffd\u52a0<\/h2>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/blob\/php-7.4.3\/ext\/mysqlnd\/mysqlnd_auth.c#L939-L985\">\u3053\u306e\u3042\u305f\u308a<\/a>\u3092\u898b\u308b\u3068\u3001<\/p>\n<pre><code>$ sudo perf probe -s \".\/php7.4-7.4.3\" -x \/usr\/lib\/php\/20190902\/mysqlnd.so -L mysqlnd_caching_sha2_get_key\n<mysqlnd_caching_sha2_get_key@.\/php7.4-7.4.3\/.\/ext\/mysqlnd\/mysqlnd_auth.c:0>\n      0  mysqlnd_caching_sha2_get_key(MYSQLND_CONN_DATA *conn)\n         {\n      2         RSA * ret = NULL;\n      3         const MYSQLND_PFC_DATA * const pfc_data = conn->protocol_frame_codec->data;\n      4         const char * fname = (pfc_data->sha256_server_public_key && pfc_data->sha256_server_public_key[0] != '\\0')?\n                                                                        pfc_data->sha256_server_public_key:\n                                                                        MYSQLND_G(sha256_server_public_key);\n      7         php_stream * stream;\n      8         DBG_ENTER(\"mysqlnd_cached_sha2_get_key\");\n      9         DBG_INF_FMT(\"options_s256_pk=[%s] MYSQLND_G(sha256_server_public_key)=[%s]\",\n                                         pfc_data->sha256_server_public_key? pfc_data->sha256_server_public_key:\"n\/a\",\n                                         MYSQLND_G(sha256_server_public_key)? MYSQLND_G(sha256_server_public_key):\"n\/a\");\n     12         if (!fname || fname[0] == '\\0') {\n     13                 MYSQLND_PACKET_CACHED_SHA2_RESULT req_packet;\n     14                 MYSQLND_PACKET_SHA256_PK_REQUEST_RESPONSE pk_resp_packet;\n         \n     16                 do {\n     17                         DBG_INF(\"requesting the public key from the server\");\n     18                         conn->payload_decoder_factory->m.init_cached_sha2_result_packet(&req_packet);\n     19                         conn->payload_decoder_factory->m.init_sha256_pk_request_response_packet(&pk_resp_packet);\n     20                         req_packet.request = 1;\n         \n     22                         if (! PACKET_WRITE(conn, &req_packet)) {\n     23                                 DBG_ERR_FMT(\"Error while sending public key request packet\");\n     24                                 php_error(E_WARNING, \"Error while sending public key request packet. PID=%d\", getpid());\n                                        SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT);\n                                        break;\n                                }\n     28                         if (FAIL == PACKET_READ(conn, &pk_resp_packet) || NULL == pk_resp_packet.public_key) {\n     29                                 DBG_ERR_FMT(\"Error while receiving public key\");\n     30                                 php_error(E_WARNING, \"Error while receiving public key. PID=%d\", getpid());\n     31                                 SET_CONNECTION_STATE(&conn->state, CONN_QUIT_SENT);\n     32                                 break;\n                                }\n     34                         DBG_INF_FMT(\"Public key(%d):\\n%s\", pk_resp_packet.public_key_len, pk_resp_packet.public_key);\n                                \/* now extract the public key *\/\n                                {\n     37                                 BIO * bio = BIO_new_mem_buf(pk_resp_packet.public_key, pk_resp_packet.public_key_len);\n     38                                 ret = PEM_read_bio_RSA_PUBKEY(bio, NULL, NULL, NULL);\n     39                                 BIO_free(bio);\n                                }\n     41                 } while (0);\n     42                 PACKET_FREE(&req_packet);\n     43                 PACKET_FREE(&pk_resp_packet);\n         \n     45                 DBG_INF_FMT(\"ret=%p\", ret);\n     46                 DBG_RETURN(ret);<\/code><\/pre>\n<p>\u300cmysqlnd_caching_sha2_get_key:38 \u3042\u305f\u308a\u3067 pk_resp_packet.public_key \u3092\u53c2\u7167\u3067\u304d\u308c\u3070\u826f\u3044\u306e\u3067\u306f\uff1f\u300d\u3068\u601d\u3044\u307e\u3059\u304c\u3001\u3053\u306e\u8fd1\u8fba\u3067Available variables\u306f<\/p>\n<pre><code>$ sudo perf probe -s \"`pwd`\/php7.4-7.4.3\/ext\/mysqlnd\/\" -x \/usr\/lib\/php\/20190902\/mysqlnd.so --vars=mysqlnd_caching_sha2_get_key:37\nAvailable variables at mysqlnd_caching_sha2_get_key:37\n        @<mysqlnd_handle_local_infile.cold+142>\n                MYSQLND_CONN_DATA*      conn\n$ sudo perf probe -s \"`pwd`\/php7.4-7.4.3\/ext\/mysqlnd\/\" -x \/usr\/lib\/php\/20190902\/mysqlnd.so --add=\"mysqlnd_caching_sha2_get_key:37 pk_resp_packet.public_key\"\nSorry, we don't support this variable location yet.\n  Error: Failed to add events.\n$ sudo perf probe -s \"`pwd`\/php7.4-7.4.3\/ext\/mysqlnd\/\" -x \/usr\/lib\/php\/20190902\/mysqlnd.so --vars=mysqlnd_caching_sha2_get_key:38\nAvailable variables at mysqlnd_caching_sha2_get_key:38\n        @<mysqlnd_handle_local_infile.cold+162>\n                BIO*    bio\n                MYSQLND_CONN_DATA*      conn\n$ sudo perf probe -s \"`pwd`\/php7.4-7.4.3\/ext\/mysqlnd\/\" -x \/usr\/lib\/php\/20190902\/mysqlnd.so --add=\"mysqlnd_caching_sha2_get_key:38 pk_resp_packet.public_key\"\nSorry, we don't support this variable location yet.\n  Error: Failed to add events.\n$ sudo perf probe -s \"`pwd`\/php7.4-7.4.3\/ext\/mysqlnd\/\" -x \/usr\/lib\/php\/20190902\/mysqlnd.so --vars=mysqlnd_caching_sha2_get_key:39\nAvailable variables at mysqlnd_caching_sha2_get_key:39\n        @<mysqlnd_mysqlnd_vio_enable_ssl_pub.cold+2>\n                MYSQLND_CONN_DATA*      conn\n                RSA*    ret\n$ sudo perf probe -s \"`pwd`\/php7.4-7.4.3\/ext\/mysqlnd\/\" -x \/usr\/lib\/php\/20190902\/mysqlnd.so --add=\"mysqlnd_caching_sha2_get_key:39 pk_resp_packet.public_key\"\nSorry, we don't support this variable location yet.\n  Error: Failed to add events.\n$ <\/code><\/pre>\n<p>\u3068\u306a\u308a\u3001pk_resp_packet.public_key \u306f\u53c2\u7167\u3067\u304d\u307e\u305b\u3093\u3002\u305d\u3053\u3067\u3001\u4ee3\u66ff\u6848\u3068\u3057\u3066<\/p>\n<p><a href=\"https:\/\/github.com\/php\/php-src\/blob\/php-7.4.3\/ext\/mysqlnd\/mysqlnd_auth.c#L939-L976\">https:\/\/github.com\/php\/php-src\/blob\/php-7.4.3\/ext\/mysqlnd\/mysqlnd_auth.c#L939-L976<\/a><\/p>\n<p>mysqlnd_caching_sha2_get_key() \u304c\u547c\u3070\u308c\u305f\u5f8c\u3001 <a href=\"https:\/\/linux.die.net\/man\/3\/bio_new_mem_buf\">BIO_new_mem_buf()<\/a>\u306b\u6e21\u3055\u308c\u3066\u3044\u308b pk_resp_packet.public_key \u3092\u53c2\u7167\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n<p>\u5e78\u3044\u3001BIO_new_mem_buf\u306f\u3044\u308d\u3044\u308d\u30ed\u30fc\u30ab\u30eb\u5909\u6570\u3092\u53c2\u7167\u3067\u304d\u305d\u3046\u306a\u306e\u3067<\/p>\n<pre><code>$ sudo perf probe -s \".\/openssl-1.1.1f\" -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1  -L BIO_new_mem_buf   \n<BIO_new_mem_buf@.\/openssl-1.1.1f\/\/crypto\/bio\/bss_mem.c:0>\n      0  BIO *BIO_new_mem_buf(const void *buf, int len)\n      1  {\n      2      BIO *ret;\n      3      BUF_MEM *b;\n      4      BIO_BUF_MEM *bb;\n      5      size_t sz;\n         \n      7      if (buf == NULL) {\n      8          BIOerr(BIO_F_BIO_NEW_MEM_BUF, BIO_R_NULL_PARAMETER);\n      9          return NULL;\n             }\n     11      sz = (len < 0) ? strlen(buf) : (size_t)len;\n     12      if ((ret = BIO_new(BIO_s_mem())) == NULL)\n                 return NULL;\n     14      bb = (BIO_BUF_MEM *)ret->ptr;\n     15      b = bb->buf;\n             \/* Cast away const and trust in the MEM_RDONLY flag. *\/\n     17      b->data = (void *)buf;\n     18      b->length = sz;\n     19      b->max = sz;\n     20      *bb->readp = *bb->buf;\n     21      ret->flags |= BIO_FLAGS_MEM_RDONLY;\n             \/* Since this is static data retrying won't help *\/\n     23      ret->num = 0;\n     24      return ret;\n         }\n         \n         static int mem_init(BIO *bi, unsigned long flags)\n\n$ sudo perf probe -s \".\/openssl-1.1.1f\" -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1  --vars=BIO_new_mem_buf\nAvailable variables at BIO_new_mem_buf\n        @<BIO_new_mem_buf+0>\n                 (unknown_type  buf\n                int     len\n$ sudo perf probe -s \".\/openssl-1.1.1f\" -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1  --vars=BIO_new_mem_buf:18\nAvailable variables at BIO_new_mem_buf:18\n        @<BIO_new_mem_buf+66>\n                 (unknown_type  buf\n                BIO*    ret\n                BIO_BUF_MEM*    bb\n                BUF_MEM*        b\n                size_t  sz\n$ <\/code><\/pre>\n<pre><code>$ sudo perf probe --list\n$ sudo perf probe -x \/usr\/lib\/php\/20190902\/mysqlnd.so -a mysqlnd_caching_sha2_get_key\nAdded new event:\n  probe_mysqlnd:mysqlnd_caching_sha2_get_key (on mysqlnd_caching_sha2_get_key in \/usr\/lib\/php\/20190902\/mysqlnd.so)\n\nYou can now use it in all perf tools, such as:\n\n        perf record -e probe_mysqlnd:mysqlnd_caching_sha2_get_key -aR sleep 1\n\n$ sudo perf probe -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 -a \"BIO_new_mem_buf:18 b->data:string\"\nAdded new event:\n  probe_libcrypto:BIO_new_mem_buf (on BIO_new_mem_buf:18 in \/usr\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 with data=b->data:string)\n\nYou can now use it in all perf tools, such as:\n\n        perf record -e probe_libcrypto:BIO_new_mem_buf -aR sleep 1\n\n$ sudo perf probe --list\n  probe_libcrypto:BIO_new_mem_buf (on BIO_new_mem_buf:18@..\/crypto\/bio\/bss_mem.c in \/usr\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 with data)\n  probe_mysqlnd:mysqlnd_caching_sha2_get_key (on mysqlnd_caching_sha2_handle_server_response:48@.\/ext\/mysqlnd\/mysqlnd_auth.c in \/usr\/lib\/php\/20190902\/mysqlnd.so)\n$ sudo cat \/sys\/kernel\/debug\/tracing\/uprobe_events\np:probe_mysqlnd\/mysqlnd_caching_sha2_get_key \/usr\/lib\/php\/20190902\/mysqlnd.so:0x000000000001f1c0\np:probe_libcrypto\/BIO_new_mem_buf \/usr\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1:0x00000000000ae062 data=+0(+8(%dx)):string\n$ <\/code><\/pre>\n<p>\u3068\u3057\u307e\u3057\u305f\u3002<\/p>\n<h2>\u30c8\u30ec\u30fc\u30b9\u3057\u3066\u307f\u308b<\/h2>\n<p><code>\/sys\/kernel\/debug\/tracing\/uprobe_events<\/code> \u306b probe point \u304c\u8ffd\u52a0\u3055\u308c\u305f\u3089\u3001\u3042\u3068\u306f\u3000<br \/>\n <code>perf trace<\/code> \u3084 <code>perf record<\/code> \u3067\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002<\/p>\n<h3>perf trace<\/h3>\n<pre><code>$ sudo perf trace -e probe_mysqlnd:mysqlnd_caching_sha2_get_key -e probe_libcrypto:BIO_new_mem_buf php test.php \nClient library version: mysqlnd 7.4.3-4ubuntu2.19\n     0.000 php\/35274 probe_mysqlnd:mysqlnd_caching_sha2_get_key:(7fb760cee1c0)\n     0.057 php\/35274 probe_libcrypto:BIO_new_mem_buf:(7fb76306b062) data=\"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsBtJzVsRaEjjIn8vM4kz\nFMI6RYxXCjpOE6nrXlpmeB9KJcNZPuhuhmIWaQgKQnfrk+PBC862CyXBFeVxPzOn\ndzRwXBKM540HMU3WGFouVIKwFmnTl0L6J0EEWE1jWab3I30M4Di7rYRdyuEUSKky\n2jaa7R\/jtX+x286Z4Gci2gcTU3WkOlyAZlRJPgNwcb6oN6tSKix3zxeQYdUKw2n3\nY3iNw+zr4TRfJ6AQJqei+hm4dnMuibg9JtwmJ1VbS1kfctEg3y3ASsSPbWkOadU7\n3\/pGsp+orIGaMrO0cQhKJEK2ibrAx7AmsbzL1+dlZVrfkxVvSXxK6708kBjAc4dK\nWQIDAQAB\n-----END PUBLIC KEY-----\n\"\nPHP7.4.3-4ubuntu2.19\nSsl_cipher ()\nsejima (caching_sha2_password)\n$ \n<\/code><\/pre>\n<h3>perf record &amp; perf script<\/h3>\n<pre><code>$ sudo perf record -e probe_mysqlnd:mysqlnd_caching_sha2_get_key -e probe_libcrypto:BIO_new_mem_buf -aR sleep 10\n<\/code><\/pre>\n<p>\u306e\u3088\u3046\u306b\u3001 perf record \u53e9\u3044\u3066\u308b\u88cf\u3067<\/p>\n<pre><code>$ php test.php\nClient library version: mysqlnd 7.4.3-4ubuntu2.19\nPHP7.4.3-4ubuntu2.19\nSsl_cipher ()\nsejima (caching_sha2_password)\n$\n<\/code><\/pre>\n<p>\u3059\u308b\u3068<\/p>\n<pre><code>$ sudo perf record -e probe_mysqlnd:mysqlnd_caching_sha2_get_key -e probe_libcrypto:BIO_new_mem_buf -aR sleep 10\n[ perf record: Woken up 1 times to write data ]\n[ perf record: Captured and wrote 0.294 MB perf.data (2 samples) ]\n$ sudo perf script\n             php 35325 [013] 17824.257241: probe_mysqlnd:mysqlnd_caching_sha2_get_key: (7ff2da4e71c0)\n             php 35325 [013] 17824.257289:            probe_libcrypto:BIO_new_mem_buf: (7ff2dc864062) data=\"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsBtJzVsRaEjjIn8vM4kz\nFMI6RYxXCjpOE6nrXlpmeB9KJcNZPuhuhmIWaQgKQnfrk+PBC862CyXBFeVxPzOn\ndzRwXBKM540HMU3WGFouVIKwFmnTl0L6J0EEWE1jWab3I30M4Di7rYRdyuEUSKky\n2jaa7R\/jtX+x286Z4Gci2gcTU3WkOlyAZlRJPgNwcb6oN6tSKix3zxeQYdUKw2n3\nY3iNw+zr4TRfJ6AQJqei+hm4dnMuibg9JtwmJ1VbS1kfctEg3y3ASsSPbWkOadU7\n3\/pGsp+orIGaMrO0cQhKJEK2ibrAx7AmsbzL1+dlZVrfkxVvSXxK6708kBjAc4dK\nWQIDAQAB\n-----END PUBLIC KEY-----\n\"\n$ \n<\/code><\/pre>\n<p>\u3053\u3046\u306a\u308a\u307e\u3059\u3002<\/p>\n<h3>perf probe --add \u306b\u3064\u3044\u3066\u88dc\u8db3<\/h3>\n<p>Ubuntu 20.04 LTS \u3067\u3082\u3001 kernel 5.4 \u3068 kernel 5.15 \u3067 <code>perf probe --add<\/code> \u306e\u632f\u308b\u821e\u3044\u304c\u7570\u306a\u308a\u307e\u3057\u305f\u3002<br \/>\n\u4f8b\u3048\u3070\u3001 <code>sudo perf probe -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 -a \"BIO_new_mem_buf:18 b-&gt;data:string\"<\/code> \u3042\u305f\u308a\u306e\u632f\u308b\u821e\u3044\u306f\u3001\u6b21\u306e\u3088\u3046\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre><code>$ lsb_release -a\nNo LSB modules are available.\nDistributor ID: Ubuntu\nDescription:    Ubuntu 20.04.6 LTS\nRelease:        20.04\nCodename:       focal\n$ uname -r\n5.15.0-78-generic\n$ perf --version\nperf version 5.15.99\n$ sudo perf probe -x \/usr\/lib\/php\/20190902\/mysqlnd.so -a mysqlnd_caching_sha2_get_key\nAdded new event:\n  probe_mysqlnd:mysqlnd_caching_sha2_get_key (on mysqlnd_caching_sha2_get_key in \/usr\/lib\/php\/20190902\/mysqlnd.so)\n\nYou can now use it in all perf tools, such as:\n\n        perf record -e probe_mysqlnd:mysqlnd_caching_sha2_get_key -aR sleep 1\n\n$ sudo perf probe -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 -a \"BIO_new_mem_buf:18 b->data:string\"\nAdded new event:\n  probe_libcrypto:BIO_new_mem_buf_L18 (on BIO_new_mem_buf:18 in \/usr\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 with data=b->data:string)\n\nYou can now use it in all perf tools, such as:\n\n        perf record -e probe_libcrypto:BIO_new_mem_buf_L18 -aR sleep 1\n\n$ sudo perf probe --list\n  probe_libcrypto:BIO_new_mem_buf_L18 (on BIO_new_mem_buf:18@..\/crypto\/bio\/bss_mem.c in \/usr\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 with data)\n  probe_mysqlnd:mysqlnd_caching_sha2_get_key (on mysqlnd_caching_sha2_handle_server_response:48@.\/ext\/mysqlnd\/mysqlnd_auth.c in \/usr\/lib\/php\/20190902\/mysqlnd.so)\n$ sudo cat \/sys\/kernel\/debug\/tracing\/uprobe_events\np:probe_mysqlnd\/mysqlnd_caching_sha2_get_key \/usr\/lib\/php\/20190902\/mysqlnd.so:0x000000000001f1c0\np:probe_libcrypto\/BIO_new_mem_buf_L18 \/usr\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1:0x00000000000ae062 data=+0(+8(%dx)):string\n$ sudo perf trace -e probe_mysqlnd:mysqlnd_caching_sha2_get_key -e probe_libcrypto:BIO_new_mem_buf_L18 php test.php\n\nClient library version: mysqlnd 7.4.3-4ubuntu2.19\n     0.000 php\/35253 probe_mysqlnd:mysqlnd_caching_sha2_get_key(__probe_ip: 140319895433664)\n     0.055 php\/35253 probe_libcrypto:BIO_new_mem_buf_L18(__probe_ip: 140319932645474, data: \"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzYf\/ww9KSyIKOfSwRlLL\nEVrZos0\/bYIbQpPAR9gW3IaBeo\/+ncWNg7c\/HXvDYTqHRYtcb7sC0FCKefWp1rZv\nZTKPR\/3Lapam2NasA7GlR+7QLvaU1FEaa2nyTpPrIsALdhJTpwUY2\/EXiVfCkPq9\nSM5S57HSwA+6r83pAdnPOZcLeu5k5NJ3A1Ggqxz3d7vlOfjcL2JGEmldoBBFGHv8\nFVMYzPGEdFfPlAJpZjwU9GkQhI9Bf4ePlWKwvaO1woaCX1N2bmlo19qX1w\/4FrnG\neQZgpAgYg\/nRG5ZKo\/xcmVstZxWHOjLdWHutEyChgqfubGqH+Qr3sDymnYMl1KAH\nUQIDAQAB\n-----END PUBLIC KEY-----\n\")\nPHP7.4.3-4ubuntu2.19\nSsl_cipher ()\nsejima (caching_sha2_password)\n$ <\/code><\/pre>\n<p>uprobe\u5468\u308a\u306f\u307e\u3060\u307e\u3060\u767a\u5c55\u9014\u4e0a\u306a\u306e\u3067\u3057\u3087\u3046\u3002<\/p>\n<h2>bpftrace\u3068perf probe\u3067\u306e\u9055\u3044\u306a\u3069<\/h2>\n<p>bpftrace \u3067\u3082\u8efd\u304f\u78ba\u8a8d\u3057\u3066\u304a\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre><code>$ sudo perf probe --list\n$ sudo cat \/sys\/kernel\/debug\/tracing\/uprobe_events\n<\/code><\/pre>\n<p>\u306b\u3057\u305f\u72b6\u614b\u3067\u3082<\/p>\n<pre><code>$ sudo bpftrace -e 'uprobe:\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1:BIO_new_mem_buf {printf(\"%s\\n\", str(arg0));}'\n<\/code><\/pre>\n<p>\u3068attach\u3059\u308c\u3070\u3001\u305d\u306e\u88cf\u3067<\/p>\n<pre><code>$ php test.php\nClient library version: mysqlnd 7.4.3-4ubuntu2.19\nPHP7.4.3-4ubuntu2.19\nSsl_cipher ()\nsejima (caching_sha2_password)\n$ \n<\/code><\/pre>\n<p>\u53e9\u304f\u3068<\/p>\n<pre><code>$ sudo bpftrace -e 'uprobe:\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1:BIO_new_mem_buf {printf(\"%s\\n\", str(arg0));}'\nAttaching 1 probe...\n-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n<\/code><\/pre>\n<p>\u3068\u306a\u308a\u307e\u3059\u3002<br \/>\nbpftrace \u306e\u5834\u5408\u3001 Debug Symbol Package \u304c\u5fc5\u8981\u306b\u306a\u308b\u30b1\u30fc\u30b9\u3068\u306a\u3089\u306a\u3044\u30b1\u30fc\u30b9\u304c\u3042\u308b\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>\u4f8b\u3048\u3070\u3001php7.4-mysql-dbgsym\u304c\u306a\u3044\u3068\u3001 <code>mysqlnd_caching_sha2_handle_server_response<\/code> \u306b attach \u3067\u304d\u307e\u305b\u3093\u304c<\/p>\n<pre><code>$ dpkg --list | grep dbgsym\nii  ubuntu-dbgsym-keyring                       2020.02.11.4                               all          GnuPG keys of the Ubuntu Debug Symbols Archive\n$ sudo bpftrace -e 'uprobe:\/usr\/lib\/php\/20190902\/mysqlnd.so:mysqlnd_caching_sha2_handle_server_response {printf(\"in here\\n\");}'\nAttaching 1 probe...\nCould not resolve symbol: \/usr\/lib\/php\/20190902\/mysqlnd.so:mysqlnd_caching_sha2_handle_server_response\n$ \n<\/code><\/pre>\n<pre><code>$ dpkg --list | grep dbgsym\nii  php7.4-mysql-dbgsym                         7.4.3-4ubuntu2.19                          amd64        debug symbols for php7.4-mysql\nii  ubuntu-dbgsym-keyring                       2020.02.11.4                               all          GnuPG keys of the Ubuntu Debug Symbols Archive\n$ sudo bpftrace -e 'uprobe:\/usr\/lib\/php\/20190902\/mysqlnd.so:mysqlnd_caching_sha2_handle_server_response {printf(\"in here\\n\");}'\nAttaching 1 probe...\n<\/code><\/pre>\n<p>libssl1.1-dbgsym \u304c\u306a\u304f\u3066\u3082\u3001BIO_new_mem_buf\u306b\u306f attach \u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n<pre><code>$ dpkg --list | grep dbgsym\nii  ubuntu-dbgsym-keyring                       2020.02.11.4                               all          GnuPG keys of the Ubuntu Debug Symbols Archive\n$ sudo bpftrace -e 'uprobe:\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1:BIO_new_mem_buf {printf(\"%s\\n\", str(arg0));}'\nAttaching 1 probe...\n<\/code><\/pre>\n<p>bpftrace \u306f\u3001 Debug Symbol Pacakge \u3067\u53c2\u7167\u53ef\u80fd\u306a\u95a2\u6570\u3067\u3042\u308c\u3070\u3001\u666e\u901a\u306b <a href=\"https:\/\/github.com\/iovisor\/bpftrace\/blob\/master\/docs\/reference_guide.md#3-uprobeuretprobe-dynamic-tracing-user-level\">uprobe:library_name:function_name<\/a> \u3067\u6307\u5b9a\u3057\u3066\u53c2\u7167\u3067\u304d\u305d\u3046\u3067\u3059\u3002<\/p>\n<pre><code>$ for i in `dpkg --listfiles php7.4-mysql-dbgsym | egrep 'debug.*.debug$'`; do echo $i; nm $i| grep mysqlnd_caching; done\n\/usr\/lib\/debug\/.build-id\/51\/a798010eb2b791dd48b9b48cc0b3c1efaaeb7d.debug\n\/usr\/lib\/debug\/.build-id\/c9\/fc402edcfb6c0a1ec9ca9419261d519adf946d.debug\n\/usr\/lib\/debug\/.build-id\/df\/abca62a7f18b6a8295e84bc0404465798386ba.debug\n000000000003f920 d mysqlnd_caching_sha2_auth_plugin\n0000000000020a80 t mysqlnd_caching_sha2_get_auth_data\n000000000001f700 t mysqlnd_caching_sha2_get_auth_data.part.0\n000000000001f6b0 t mysqlnd_caching_sha2_handle_server_response\n000000000001f0e0 t mysqlnd_caching_sha2_handle_server_response.part.0\n000000000000f5e4 t mysqlnd_caching_sha2_handle_server_response.part.0.cold\n$ sudo bpftrace -e 'uprobe:\/usr\/lib\/php\/20190902\/mysqlnd.so:mysqlnd_caching_sha2_handle_server_response {printf(\"in here\\n\");}'\nAttaching 1 probe...\n^C\n\n$ \n<\/code><\/pre>\n<p>\u4e00\u65b9\u3001 <code>perf probe --add<\/code> \u3067\u898b\u3066\u307f\u308b\u3068\u3001Debug Symbol Package \u304c\u3042\u308c\u3070\u3001<code>-a \"BIO_new_mem_buf:18 b-&gt;data:string\"<\/code> \u3068\u3044\u3046\u3088\u3046\u306a\u6307\u5b9a\u3082\u3067\u304d\u307e\u3059\u3002<br \/>\nDebug Symbol Package \u304c\u306a\u3051\u308c\u3070 <code>-a \"BIO_new_mem_buf:18 b-&gt;data:string\"<\/code> \u3068\u3044\u3063\u305f\u6307\u5b9a\u306f\u3067\u304d\u307e\u305b\u3093\u304c\u3001 <code>-a BIO_new_mem_buf<\/code> \u3068\u3044\u3063\u305f\u6307\u5b9a\u3067\u3042\u308c\u3070\u53ef\u80fd\u306a\u3088\u3046\u3067\u3059\u3002<\/p>\n<pre><code>$ dpkg --list | grep dbgsym\nii  ubuntu-dbgsym-keyring                       2020.02.11.4                               all          GnuPG keys of the Ubuntu Debug Symbols Archive\n$ sudo perf probe -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 -a BIO_new_mem_buf\nAdded new event:\n  probe_libcrypto:BIO_new_mem_buf (on BIO_new_mem_buf in \/usr\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1)\n\nYou can now use it in all perf tools, such as:\n\n        perf record -e probe_libcrypto:BIO_new_mem_buf -aR sleep 1\n\n$ sudo perf probe -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 -d BIO_new_mem_buf\nRemoved event: probe_libcrypto:BIO_new_mem_buf\n$ sudo perf probe -x \/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 -a \"BIO_new_mem_buf:18 b->data:string\"\nThe \/usr\/lib\/x86_64-linux-gnu\/libcrypto.so.1.1 file has no debug information.\nRebuild with -g, or install an appropriate debuginfo package.\n  Error: Failed to add events.\n$ <\/code><\/pre>\n<p>\u307e\u305f\u3001Debug Symbol Package \u3055\u3048\u3042\u308c\u3070\u3001mysqlnd.so\u306bmysqlnd_caching_sha2_get_key\u3067 probe point \u3092\u8ffd\u52a0\u3057\u305f\u308a\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><code>$ sudo perf probe -x \/usr\/lib\/php\/20190902\/mysqlnd.so -a mysqlnd_caching_sha2_get_key\nAdded new event:\n  probe_mysqlnd:mysqlnd_caching_sha2_get_key (on mysqlnd_caching_sha2_get_key in \/usr\/lib\/php\/20190902\/mysqlnd.so)\n\nYou can now use it in all perf tools, such as:\n\n        perf record -e probe_mysqlnd:mysqlnd_caching_sha2_get_key -aR sleep 1\n\n$\n<\/code><\/pre>\n<p>bpftrace \u3084 perf probe \u306f\u3001Debug Symbol Package \u306e\u6709\u7121\u3067\u3067\u304d\u308b\u3053\u3068\u304c\u3051\u3063\u3053\u3046\u5909\u308f\u3063\u3066\u304d\u307e\u3059\u3002<\/p>\n<h2>\u304a\u307e\u3051\u30fb\u305d\u306e\uff11\uff1aMySQL\u516c\u5f0f\u306edbgsym\u306a\u30d1\u30c3\u30b1\u30fc\u30b8<\/h2>\n<p>\u6700\u5f8c\u306b\u304a\u307e\u3051\u3067\u3001\u5c11\u3057\u306fMySQL\u3089\u3057\u3044\u3053\u3068\u3092\u3084\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002<br \/>\n<a href=\"https:\/\/dev.mysql.com\/downloads\/mysql\/\">MySQL Community Server<\/a> \u306e\u516c\u5f0f\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u898b\u308b\u3068\u3001Ubuntu\u3084Debian\u3067\u306fdbgsym\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u304c\u516c\u958b\u3055\u308c\u3066\u3044\u307e\u3059\u304b\u3089\u3001\u3053\u308c\u3092\u4f7f\u3063\u3066bpftrace\u3067\u304d\u307e\u3059\u3002\u4eca\u56de\u306f <code>perf buildid-cache<\/code> \u3092\u4f7f\u3063\u3066\u5c11\u3057\u5fdc\u7528\u7684\u306a\u3084\u308a\u304b\u305f\u3067\u8a66\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u7d20\u76f4\u306b <code>dpkg --install<\/code> \u3067\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u3082\u826f\u3044\u3093\u3067\u3059\u304c\u3001\u30b5\u30af\u30c3\u3068\u8a66\u3059\u3060\u3051\u306a\u3089\u3001*.deb\u306ftar\u3067\u5c55\u958b\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><code>$ ar x mysql-community-server-core_8.0.34-1ubuntu20.04_amd64.deb\n$ tar xf data.tar.xz \n$ ar x mysql-community-server-core-dbgsym_8.0.34-1ubuntu20.04_amd64.deb\n$ tar xf data.tar.xz \n$ ls usr\/sbin\/mysqld\nusr\/sbin\/mysqld\n$ \n<\/code><\/pre>\n<p><code>perf buildid-cache --add<\/code> \u3067 debuginfo \u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<pre><code>$ for i in `find usr\/ -type f | egrep 'debug.*.debug$'`; do sudo perf buildid-cache --add=$i; done\n<\/code><\/pre>\n<p>\u3068\u308a\u3042\u3048\u305a\u3001nm\u3067\u30b7\u30f3\u30dc\u30eb\u3092\u8abf\u3079\u3064\u3064\u3001 mysqld_main \u306b attach \u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<pre><code>$ for i in `find usr\/ -type f | egrep 'debug.*.debug$'`; do nm $i| grep mysqld_main; done\n000000000102f910 T _Z11mysqld_mainiPPc\n0000000000eee11a t _Z11mysqld_mainiPPc.cold\n$ sudo bpftrace -e 'uprobe:usr\/sbin\/mysqld:_Z11mysqld_mainiPPc { join(arg1);}'\nAttaching 1 probe...\n<\/code><\/pre>\n<p>\u305d\u306e\u88cf\u3067\u3001 usr\/sbin\/mysqld \u306b\u9069\u5f53\u306a\u5f15\u6570\u3092\u6e21\u3057\u3064\u3064\u8d77\u52d5\u3057\u3066\u307f\u308b\u3068<\/p>\n<pre><code>$ usr\/sbin\/mysqld test1 test2\n<\/code><\/pre>\n<p>\u3053\u3046\u306a\u308a\u307e\u3059\u3002<\/p>\n<pre><code>$ sudo bpftrace -e 'uprobe:usr\/sbin\/mysqld:_Z11mysqld_mainiPPc { join(arg1);}'\nAttaching 1 probe...\nusr\/sbin\/mysqld test1 test2\n<\/code><\/pre>\n<p>perf buildid-cache --add \u3057\u305f debuginfo \u306f\u3001 perf buildid-cache --remove \u3067\u524a\u9664\u3067\u304d\u307e\u3059\u3002<\/p>\n<pre><code>$ for i in `find usr\/ -type f | egrep 'debug.*.debug$'`; do sudo perf buildid-cache --remove=$i; done\n<\/code><\/pre>\n<p>probe point \u3092\u8a2d\u5b9a\u3057\u305f\u3044\u95a2\u6570\u304c\u3042\u308b\u306a\u3089\u3001\u6b21\u306e\u3088\u3046\u306b nm \u3067\u30b7\u30f3\u30dc\u30eb\u3092\u8abf\u3079\u308c\u3070\u3001bpftrace\u3067attach\u3067\u304d\u307e\u3059\u3002\u4f8b\u3048\u3070<a href=\"https:\/\/github.com\/mysql\/mysql-server\/blob\/mysql-8.0.34\/sql\/sql_parse.cc#L1307\">do_command<\/a>\u3084<a href=\"https:\/\/github.com\/mysql\/mysql-server\/blob\/mysql-8.0.34\/sql\/sql_parse.cc#L1687\">dispatch_command<\/a>\u3067\u3042\u308c\u3070<\/p>\n<pre><code>$ for i in `find usr\/ -type f | egrep 'debug.*.debug$'`; do nm $i| grep do_command; done\n00000000011477e0 T _Z10do_commandP3THD\n$ for i in `find usr\/ -type f | egrep 'debug.*.debug$'`; do nm $i| grep dispatch_command; done\n00000000011447e0 T _Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command\n0000000000ef5610 t _Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command.cold\n$ \n<\/code><\/pre>\n<p>dispatch_command\u306e\u5f15\u6570\u3067\u3042\u308b <code>enum enum_server_command command<\/code> \u3092\u8868\u793a\u3059\u308b\u3060\u3051\u306a\u3089<\/p>\n<pre><code>$ sudo bpftrace -e 'uprobe:\/usr\/sbin\/mysqld:_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command {printf(\"%d\\n\", arg2);}'\n<\/code><\/pre>\n<p>\u3057\u3066mysqldadmin ping\u3059\u308c\u3070\u3001<a href=\"https:\/\/github.com\/mysql\/mysql-server\/blob\/057f5c9509c6c9ea3ce3acdc619f3353c09e6ec6\/include\/my_command.h#L66\">COM_PING\u306e14<\/a>\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u3042\u305f\u308a\u304b\u3089\u8a66\u3057\u3066\u307f\u308b\u3068\u304a\u624b\u8efd\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u306d\u3002<\/p>\n<h2>\u304a\u307e\u3051\u30fb\u305d\u306e\uff12\uff1a bpftrace on WSL2<\/h2>\n<p>\u3061\u306a\u307f\u306b\u3001 <code>sudo bpftrace -e 'uprobe:\/usr\/sbin\/mysqld:_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command {printf(\"%d\\n\", arg2);}'<\/code> \u304f\u3089\u3044\u3067\u3042\u308c\u3070\u3001WSL2\u4e0a\u3067\u8a66\u3059\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002<\/p>\n<p>Ubuntu 22.04 LTS on WSL2 \u3067\u3084\u3063\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n<p><a href=\"https:\/\/dev.mysql.com\/downloads\/repo\/apt\/\">https:\/\/dev.mysql.com\/downloads\/repo\/apt\/<\/a> \u304b\u3089 mysql-apt-config*.deb\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066 dpkg --install\u3057\u3001<\/p>\n<pre><code>$ sudo apt update && sudo apt install bpftrace mysql-community-server mysql-community-server-core-dbgsym<\/code><\/pre>\n<p>\u3057\u3066<\/p>\n<pre><code>$ sudo -u mysql \/usr\/sbin\/mysqld &<\/code><\/pre>\n<p>\u306a\u3069\u3059\u308c\u3070\u3001<\/p>\n<pre><code>$ uname -a\nLinux G-PC-01112515 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU\/Linux\n$ sudo bpftrace -l 'uprobe:\/usr\/sbin\/mysqld:*dispatch_command*'\nuprobe:\/usr\/sbin\/mysqld:_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command\nuprobe:\/usr\/sbin\/mysqld:_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command.cold\n$ sudo bpftrace -e 'uprobe:\/usr\/sbin\/mysqld:_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command {printf(\"%d\\n\", arg2);}'\nAttaching 1 probe...\n<\/code><\/pre>\n<p>\u3057\u3066 attach \u3059\u308b\u3053\u3068\u304c\u53ef\u80fd\u3067\u3059\u3002<\/p>\n<h2>\u304a\u308f\u308a\u306b<\/h2>\n<p>bpftrace\u3084perf probe\u3001gdb\u306f\u3001\u72b6\u6cc1\u6b21\u7b2c\u3067\u4f7f\u3044\u5206\u3051\u304b\u306a\u3041\u3068\u3044\u3046\u5370\u8c61\u3092\u53d7\u3051\u307e\u3057\u305f\u3002<br \/>\n\u4f8b\u3048\u3070\u3001\u300c\u624b\u5143\u306e\u74b0\u5883\u3067gdb\u3067\u5f53\u305f\u308a\u3092\u3064\u3051\u3066\u304b\u3089\u5b9f\u74b0\u5883\u3067 bpftrace\u3001\u5fc5\u8981\u3067\u3042\u308c\u3070 Debug Symbol Package\u3044\u308c\u3066 probe point \u3092\u8a2d\u5b9a\u3057\u3066\u307f\u308b\u300d\u307f\u305f\u3044\u306a\u4f7f\u3044\u5206\u3051\u3067\u3057\u3087\u3046\u304b\u3002\u8a66\u884c\u932f\u8aa4\u3057\u3066\u307f\u308b\u306a\u3089gdb\u306e\u65b9\u304c\u878d\u901a\u304c\u52b9\u3044\u3066\u3001\u30b5\u30af\u30c3\u3068\u8a66\u3059\u306a\u3089 bpftrace\u3001\u3082\u3063\u3068\u60c5\u5831\u304c\u5fc5\u8981\u306b\u306a\u308c\u3070 perf probe --add \u304b\u306a\u3068\u3044\u3046\u6c17\u304c\u3057\u307e\u3057\u305f\u3002<br \/>\n\u4f55\u306f\u3068\u3082\u3042\u308c\u3001\u3053\u3046\u3044\u3063\u305f\u5f15\u304d\u51fa\u3057\u3068\u3044\u3046\u304b\u9078\u629e\u80a2\u304c\u8907\u6570\u3042\u308b\u306e\u306f\u3001\u826f\u3044\u3053\u3068\u3060\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<p>\u6b21\u56de\u306fMySQL8.1.0\u306e\u30c7\u30d0\u30c3\u30b0\u30d3\u30eb\u30c9\u306a\u3069\u306b\u3064\u3044\u3066\u3001\u3086\u308b\u3075\u308f\u3067\u66f8\u3053\u3046\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n<h2>References<\/h2>\n<ul>\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man1\/perf-probe.1.html\">perf-probe(1) \u2014 Linux manual page<\/a><\/li>\n<li><a href=\"https:\/\/man7.org\/linux\/man-pages\/man1\/perf-buildid-cache.1.html\">perf-buildid-cache(1) \u2014 Linux manual page<\/a><\/li>\n<li><a href=\"https:\/\/docs.kernel.org\/trace\/uprobetracer.html\">Uprobe-tracer: Uprobe-based Event Tracing<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u3053\u3093\u306b\u3061\u308f\u3002\u305b\u3058\u307e\u3067\u3059\u3002 \u73fe\u4ee3\u4eba\u306fgdb\u3088\u308abpftrace\u3092\u597d\u3080\u3068\u3044\u3046\u96fb\u6ce2\u3092\u53d7\u4fe1\u3057\u305f\u306e\u3067\u3001Debugging mysqlnd.so \uff5emysql_native_password\u304c\u5ec3\u6b62\u3055\u308c\u308b\u672a\u6765\u306b\u5099\u3048\u3066\uff5e\u306e\u3088\u3046\u306a\u3053\u3068\u3092b [&hellip;]<\/p>\n","protected":false},"author":137,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[9],"tags":[223,17,8],"class_list":["post-22599","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-info","tag-ebpf","tag-mysql","tag-php"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/22599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/users\/137"}],"replies":[{"embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/comments?post=22599"}],"version-history":[{"count":19,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/22599\/revisions"}],"predecessor-version":[{"id":22601,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/22599\/revisions\/22601"}],"wp:attachment":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/media?parent=22599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/categories?post=22599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/tags?post=22599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}