大发888游戏官网:曹工改bug--原本以为很简单的数据库字段长度不足的问题,最后竟然靠抓包才解决

admin 2个月前 (07-15) 科技 37 0

问题形貌

这两天原本忙着新功能开发,效果之前的一个项目最近要上了,然后又在测试,然后就喜提bug一枚(not mine),看bug形貌,很简单,而且内陆环境也重现了,只要输入2000个英文字符就可以复现。

焦点就是:

当义务形貌输入最大字符2000时,报未知异常

问题定位

这种字符数限制的,一样平常就是数据库的字段长度短了,于是我直接找到ssh,找到对应的日志看了一下,果真是这个问题。

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'feedback_content' at row 1
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3931)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3869)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2675)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)

还能说啥,直接上去改呗,于是连上数据库,打开表,查看表结构,发现似乎没啥问题:

这不就是设置的2000吗,岂非后面的字符集有问题吗,由于表是用的utf8mb4,岂非有影响?然后改成了下面这样:

  `feedback_content` varchar(2000) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '反馈内容',

效果并没有用,果真不应该嫌疑这个的,utf8 和 utf8mb4,差距也没那么大,这里又没有特殊字符。

另外就是,中途也试了直接用工具改表,似乎没啥问题。

中途甚至嫌疑连错库了,用下令查看了java历程(开发环境,java历程和数据库在统一台机械)的毗邻,确认库没连错。

netstat -ntp|grep 1279

然后我尝试着用1999、1998字符去验证,照样有问题,想着哥见过的bug多了,还能栽在这儿吗,着实不行就开idea,内陆debug一下吧。

这样想着,到了午饭时间,就去用饭了。

再次定位

吃完饭后,中午并没有看bug,不外有个也许思绪准备试一下。

思绪就是,服务器上用tcpdump抓应用程序和mysql之间的包,然后看看情形,看看到底是那里有问题吧。

然后下昼空了一会,就在服务器上开了抓包:

tcpdump -i lo tcp port 3306  -Ann

  • -i 抓环回网卡,由于我java服务和mysql在一台上
  • tcp port 3306 这个是捕捉表达式,意思是,抓的包,其端口(不管是source照样destination,其端口需要是3306)
  • -A Print each packet (minus its link level header) in ASCII. Handy for capturing web pages. 意为直接asicc打印包的内容,由于mysql不是完全看不懂的二进制协议,以是可以直接打印
  • -nn Don't convert protocol and port numbers etc. to names either. 端口显示数字就好,不用把着名端口转换为可读的文本

开了抓包后,然后马上去操作了一把,然后这边马上看到,包已经打印出来了(包若是许多,记得赶忙ctrl c中止抓包):

可以看到,确实是mysql 服务器报错了,和我们客户端没半毛钱关系。

然则,照样很新鲜,不知道为啥报错。

于是,我重新抓了一次包。

tcpdump -i lo tcp port 3306  -w test.pcap

这里没指定-Ann了,由于我们这次是要保留下来,到test.pcap这个文件。

然后再去测了一下,然后回来ctrl c,可以看到如下信息:

大发888游戏官网:曹工改bug--原本以为很简单的数据库字段长度不足的问题,最后竟然靠抓包才解决 第1张

(这里仅供演示,没再去测试了,我把下昼抓的包给人人看)

wireshark剖析

用wireshark打开该test.pcap,可以看到:

大发888游戏官网:曹工改bug--原本以为很简单的数据库字段长度不足的问题,最后竟然靠抓包才解决 第2张

可以发现,wireshark直接内置了mysql的剖析协议,很利便,我们这里隐去了一些表信息。人人学着用一下,很简单。

然则现在还没看出来问题,我仔细观察了一下,

大发888游戏官网:曹工改bug--原本以为很简单的数据库字段长度不足的问题,最后竟然靠抓包才解决 第3张

上图中,我发现,每一列后,都市跟个逗号来分开;然则,我们反馈内容那一列,前面怎么那么多个点呢?

然后基本可以一定,是程序在里面加料了,然后去看了代码逻辑,果真,程序里,对前端传过来的内容,前面还拼了一些器械进去,然后基本就这样找到问题了。

实际上,我们也可以这样看,对着这个包,点右键,follow stream,就会把这个socket 四元组的通讯都过滤出来。

大发888游戏官网:曹工改bug--原本以为很简单的数据库字段长度不足的问题,最后竟然靠抓包才解决 第4张

注重,上图是asicc显示的,我们切换为utf8看一下,就很显著了。

大发888游戏官网:曹工改bug--原本以为很简单的数据库字段长度不足的问题,最后竟然靠抓包才解决 第5张

总结

问题自己很简单,由于惯性头脑,我也没有第一时间去看营业逻辑,本能地最先嫌疑mysql那里的问题去了,实在照样应该先看看营业。

另外,tcpdump、wireshark这类神器,人人一定要掌握,缩小问题界限、差别服务间问题甩锅啥的,就靠它了。

对了,这里分享下最近画的JVM脑图一张,有用的话,人人给脑图点个赞哈。
https://www.processon.com/view/link/5f0ad405f346fb3fdc66a153

,

欧博注册

欢迎进入欧博注册(Allbet Game):www.aLLbetgame.us,欧博官网是欧博集团的官方网站。欧博官网开放Allbet注册、Allbe代理、Allbet电脑客户端、Allbet手机版下载等业务。

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:779
  • 页面总数:0
  • 分类总数:8
  • 标签总数:1285
  • 评论总数:468
  • 浏览总数:31839