==5998== Thread 16:==5998== Invalid read of size 4==5998== at 0×30B560B0F0: pthread_kill (in /lib64/libpthread-2.5.so)==5998== by 0×7822A4: thr_alarm (in /home/dingqi/innodb_ssd/mysql/libexec/mysqld)
==5998== by 0×598E62: my_real_read(st_net*, unsigned long*) (in /home/dingqi/innodb_ssd/mysql/libexec/mysqld)
==5998== by 0×599264: my_net_read (in /home/dingqi/innodb_ssd/mysql/libexec/mysqld)
==5998== by 0×5AA14E: handle_one_connection (in /home/dingqi/innodb_ssd/mysql/libexec/mysqld)
==5998== by 0×30B56062F6: start_thread (in /lib64/libpthread-2.5.so)
==5998== by 0×30B4AD1B6C: clone (in /lib64/libc-2.5.so)
==5998== Address 0×3197D9D0 is on thread 15’s stack
thread 16访问了thread 15的栈空间数据!
3
、分析
这里我们先不考虑两个thread分别是作什么的,但这种错误必然留下隐患。
在手头的其他环境对照试验如下:
|
Os & gcc版本
|
x86_64-redhat-linux
gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)
|
x86_64-redhat-linux
gcc version 3.4.6 20060404 (Red Hat 3.4.6-3)
|
Target: i386-redhat-linux
gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)
手头环境不多,初步认为是: 在64位机器上gcc版本为4.1.2时,会出现如上问题。
需要查出为什么环境不同造成生成的可执行版本有差异。想到Makefile。
将不同环境下的Makefile作diff后赫然发现,出问题版本的Makefile有这行
CXXFLAGS = -O3 -fno-implicit-templates -fno-exceptions -fno-rtti 与其他机器不同。
而这个文件中CFLAGS确是-O2! 是否因为优化级别不同造成的?
在原环境中重复步骤,当将./configure 改成 CFLAG=”-O2 ” CXXFLAGS=”-O2 ” ./configure, 结果发现运行正常了。
4
、阶段结论及后续思考
1) 阶段结论: 由于出问题环境中configure后生成的Makefile中CXXFLAGS为-O3,与CFLAGS中的-O2冲突,导致线程访问出错。
为验证此结论,将CFLAGS和CXXFLAGS都设置为-O3或-O2,在原环境上重复步骤,运行正常。
因此对于用于线上的服务,编译时最好明确指明需要的参数,以防默认参数之间的冲突造成异常
。
2)后续的问题是, 为什么这两个优化级别不同会导致如上的现象? Debug模式下参数传递过程中dump是否也是这个原因?优化级别是如何影响到此过程的? 另查。
navicat通过ssh连接方式远程mysql(远程mysql3306端口关闭或者只允许localhost链接状态)...
navicat通过ssh连接方式远程mysql(远程mysql3306端口关闭或者只允许localhost链接状态)...
Navicat使用HTTP通道连接MySQL(远程mysql3306端口关闭或者只允许localhost链接状态)...
Navicat使用HTTP通道连接MySQL(远程mysql3306端口关闭或者只允许localhost链接状态)...
MySQL only_full_group_by 1055 报错的三种解决方案,临时关闭有影响吗?
当我们迁移到 MySQL 5.7+ 的版本时,常会碰到 `ERROR 1055 only_full_group_by` 错误,这是 5.7 之后 `SQL_MODE` 默认打开了严格模式导致的错误。说明你代码里有地方写的不严谨。
|