1.简介
对MySQL源码感兴趣的小伙伴,在学习源码的过程中都会有想一探某处代码在运行时当前的数据是个怎样的内容或者执行流程,想要知道具体情况无非可以通过两种方式,一种是gdb下断点查看,另外一种就是直接在想要查看的代码位置加入日志输出方式。输出日志的方式又分多种,比如有的可以用自带的设置调试模式输出调试日志,有的则可以采用自己添加输出错误日志形式。我们此处要说的就是使用后者,因本人比较习惯使用直接按自定义的格式自由组合输出且无参数限制方式,并希望实时看到输出信息,而目前现有的MySQL几个日志输出函数并不完全满足需求,因此在MySQL原有的一些函数基础上封装出一个可以满足需要的函数my_message_print
。
2.具体函数实现
啰嗦一堆干货如下,本实现适用于MySQL8.0及以上代码
1)在源码目录include/my_sys.h 文件最后#endif 之上添加如下声明
#define outfilename(x) strrchr(x,'/')?strrchr(x,'/')+1:xextern void debug_message_print(const char *format, ...) MY_ATTRIBUTE((format(printf, 1,2)));#define my_message_print(format, ...) debug_message_print("\r\n\033[44;37m---->%s|%s|%d|\033[0m" format, outfilename(__FILE__), __FUNCTION__, __LINE__, ##__VA_ARGS__)
该声明主要功能定义输出日志的头包含打印日志所在文件、所在函数、所在行数。同时为了便于查看加入终端实时输出时日志的颜色区分,以及从行首覆盖输出的设置。
2)在源码目录mysys/my_error.cc文件内最后追加以下函数
void debug_message_print(const char *format, ...) { va_list args; char ebuff[ERRMSGSIZE]; DBUG_TRACE; enum loglevel level = WARNING_LEVEL; va_start(args, format); (void)vsnprintf(ebuff, sizeof(ebuff), format, args); va_end(args); my_message_local(level,EE_DEBUG_INFO,ebuff);}
3.编译调用
编译成功终于就可以自由输出了!
调用:
在需要输出的代码内添加类似:my_message_print("%d,%s%xxxxx......",看看参数a,看看参数b,xxxxx,....); 来输出感兴趣的参数内容。
在sql_yacc.yy
之中也可以使用呦。
例如在sql_yacc.yy
中感兴趣代码位置添加日志输出:
my_message_print(">>>>>>>>>>>>>>>>>>>我是查询");my_message_print(">>>>>>>>>>>>>>>>>>>查询表[%s]",$1.str);
实时查看
Linux或Mac环境小伙伴可以通过终端执行命令:tail -f mysql.log 来实时监控查看到日志的输出。
编译并执行查询语句,tail -f mysql.log实时查看mysql.log文件
即可看到输出如:
---->sql_yacc.yy|MYSQLparse|16799|>>>>>>>>>>>>>>>>>>>查询表[test1]. ---->sql_yacc.yy|MYSQLparse|10570|>>>>>>>>>>>>>>>>>>>我是查询.
Enjoy GreatSQL 🙂