记一次字符乱码bug解决过程

前言

最近被分配了一个bug:解决上报数据中文乱码问题。d⊂(ο・㉨・ο)⊃又是字符乱码问题。

大概背景是:该数据是在produce.dll中通过assemble.dll组装,调用upload.dll上传的

如何在多个模块中定位是哪个环节出的问题,这是比较恶心和比较棘手的问题~

解决过程

一、首先解决如何在多个模块中定位哪个环节出的问题

1)通过日志定位问题。本来是想通过看日志定位问题的,但是日志显示的没有乱码,然而抓的包以utf-8显示时,发现就乱码了,所以通过日志定位不可行。

2)通过调试定位问题。不能看日志,那就只能上手调啦~由于复现环境不是本机,是远程机器,那只能远程调试,我会的远程调试只有俩:visual studio远程调试和windbg远程调试。由于远程机器环境是windows server,所以visual studio似乎attach不上去,我就放弃它,选择windbg远程调试了。

windbg远程调试不是很麻烦,只要把对应模块的pbd和代码拷贝到远程机器,然后就attach对应进程,下断点(可通过bp命令或打开代码下断点),触发产生中文乱码现象,这时就会走到断点,然后逐步调试即可。

 通过调试,发现是assemble.dll组装时乱码了,导致上传乱码了,坑啊!assemble.dll模块该部分逻辑已经用很久了,一开始就没想过会是这里问题...还是别太相信前人...d(•́へ•́╬)

二、定位到模块后,如何发现是哪个组装逻辑出错导致乱码

菜鸟如我,解决乱码这个问题还是有点头疼+不自信,定位到大概范围后,我就虚心请教大佬了~大佬说:

CString和string互转就是容易出中文乱码问题,瞅瞅是不是互转导致的,把这部分的来回转换的结果以CString格式输出,这样就可以定位哪个组装逻辑出错!CString是宽字节存储的,它显示的字符串没乱码,则可以说明没乱码~

于是我就虚心接受大佬意见,把那范围内的转换前后的字符串以 CString格式输出,调试发现就是使用代码公共库导致的乱码!!!坑啊!!!!

bug产生原因大概是:

前面组装的数据是UTF-8格式保存的CString类型的东西,然后调用代码公共库,出来的就是乱码了,因为代码公共库里对这个CString东西强转,代码类似酱紫:

LPCTSTR lpValue = utf8保存的CString东西;

jvRoot[CStringA(lpKey)] = (LPCSTR)CStringA(lpValue);

总结

从日志定位不到问题了,就不要死磕日志,如往模块里加更多日志,然后重试。直接上手调试吧,虽然搭建调试环境有点麻烦,但是弄好后定位问题就快很多了~

另外,即使是前人写的模块,用了很久没发现问题,定位问题时也可以大胆质疑~个人觉得定位bug,应该怀着谁也不要信的态度去定位,这样可能不会被坑得那么惨。。。。

以上

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值