mysql命令行登陆报Segmentation fault

用mysql8.0.35的源码在ubutun编译mysql出来后,用mysql命令行登陆时Segmentation fault错误,通过gdb调试mysql时发现错误行在mysql-8.0.35/extra/libedit/libedit-20221030-3.1/src/terminal.c的 346行if (cap == NULL || *cap == ‘\0’),可能是cap的内存值不被授权访问,用bt查看其调用栈,函数在第898行terminal_alloc(el, t, tgetstr(strchr(t->name, *t->name), &area));说明函数tgetstr(strchr(t->name, *t->name), &area)返回的值可能有问题,
重新用make进行编译,出现了warning,
/mysql-8.0.35/extra/libedit/libedit-20221030-3.1/src/terminal.c:897:35: warning: implicit declaration of function ‘tgetstr’; did you mean ‘tigetstr’? [-Wimplicit-function-declaration]
897 | char *tmp=tgetstr(strchr(t->name, *t->name), &area);
| ^~~~~~~
| tigetstr
mysql-8.0.35/extra/libedit/libedit-20221030-3.1/src/terminal.c:897:35: warning: initialization of ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]

怀疑是tgetstr函数没有声明,找不到其类型,默认用int进行了cast 成char*,导致出现问题,查看
terminal.h中

#ifdef __sun
extern int tgetent(char *, const char *);
extern int tgetflag(char *);
extern int tgetnum(char *);
extern int tputs(const char *, int, int (*)(int));
extern char* tgoto(const char*, int, int);
extern char* tgetstr(char*, char**);
#endif

有定义,但需要定义了__sun,导致在编译时找不到tgetstr的声明,编译器默认了其返回值时int,导致类型转换错误。
修改方式,将条件编译#ifdef __sun注释,重新make && make install,问题解决

参考了此篇文章,,用上面的方法最终解决

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值