时间:2021-07-01 10:21:17 帮助过:8人阅读
当看到最后一句 Build files have been written to: C:/2/mysql-5.7.12/brelease
,恭喜你,MySQL.sln
生成好了。
我的电脑安装的是visual studio 2019
,接下来打开MySql.Sln整体编译,需要等个十几分钟,看到下面的输出就算安装成功。
这里要做两件事情,第一件事是将mysql的调试模式打开,第二件事就是附加 --initialize
启动参数。
修改C:\2\mysql-5.7.12\sql\mysqld.cc
中的 test_lc_time_sz
方法中的 DBUG_ASSERT(0); 改成 DBUG_ASSERT(1); 如下图:
上一篇大家都知道了,mysqld项目是mysql的启动项目,main函数也在其中,在F5调试之前增加初始化参数 --console --initialize
,如下图:
启动之后,有103个报错,气人呀。。。看错误信息应该是编码问题,如下图:
修改起来也很简单,将 C:\2\mysql-5.7.12\sqlsql_locale.cc
用 [utf-8 + BOM] 格式保存一下,然后对mysqld项目Rebuild再Ctrl+F5
直接运行,终于谢天谢地,从输出可以看到,搞定啦。。。太不容易啦。
从上图中可以看到,默认密码是:zJDE>IC5o+ya,先记录下这个密码,然后再把CommandLine Arguments 中的--initialize去掉再重启Console。
可以看到,3306端口已开启,然后用刚才的 zJDE>IC5o+ya 连接即可,这里我使用navicat。
连接上去后会提示修改默认密码,设置我就设置为:123456 ,????嘿嘿,一切搞定~~~
上一篇我们追踪到了 write_row 就断掉了,我当时说它是一个虚方法,由底层具体的存储引擎去调用,代码如下:
int handler::ha_write_row(uchar *buf)
{
MYSQL_TABLE_IO_WAIT(m_psi, PSI_TABLE_WRITE_ROW, MAX_KEY, 0,{ error= write_row(buf); })
}
//这是一个虚方法
virtual int write_row(uchar *buf __attribute__((unused)))
{
return HA_ERR_WRONG_COMMAND;
}
到底这话虚不虚,这次我亲自调试一下给大家看看,证据先行哈。。。为了方便,我生成一条创表sql。
drop database if exists `datamip`;
create database `datamip`;
drop table if exists `datamip`.`customer`;
create table `datamip`.`customer` (
`customerID` int NOT NULL AUTO_INCREMENT COMMENT ‘自增主键‘,
`customerName` varchar(50) COMMENT ‘用户姓名‘,
`email` varchar(50) COMMENT ‘邮箱地址‘,
`desc` varchar(50) COMMENT ‘描述‘,
primary key (`customerID`)
) ENGINE=InnoDB charset=utf8 collate=utf8_bin;
接下来,大家看仔细了,在源码 int handler::ha_write_row(uchar *buf)
方法处下一个断点,然后F5调试应用程序。
接下来可以执行insert操作,这地方会命中断点的。
insert into `datamip`.`customer`(customerName,email,`desc`) values(‘mary‘,‘123456789@qq.com‘,‘vip‘);
可以看到,断点命中了,然后进行单步调试,最终你会看到代码会进入到 C:\2\mysql-5.7.12\storage\innobase\handler\ha_innodb.cc
中的 int ha_innobase::write_row
方法,如下图:
然后找几个局部变量和调用堆栈看看。。。
这就是我花了一下午的时间总结出的进坑出坑指南,希望能帮助大家节省时间,还是那句话,源码面前,不谈隐私,若还能进行调试,那一切皆为蝼蚁!
JAVA优化师入门教程——如何使用visual studio 对mysql进行源码级调试和优化
标签:ann 打开 提示 class 解决方案 ram x64 man 怎么