项目是工业自动化程序,内容比较复杂,出问题的现象是点击页面的一个按钮之后,在新弹出的页面做修改,保存并返回时页面崩溃,出现段错误。
因为多处使用mhm,我就随手把它放到了最上面
在本地虚拟机始终没有复现问题,接口调用比较深,在send_pattern内部就对当前窗口做了关闭,并重新绘制了上一个窗口,我在绘制接口最后加了一些日志打印,打印正常,导致我以为函数已经顺利结束,无法定位问题发生在哪里。
后来没有思路了决定用gdb调试来看一下窗口关闭后程序又走到了哪里,一看才发现最外层的这个接口还有几行代码没走完。
又接着查最后这五行代码,其中前四行都是简单的设置和读取字段值,最后一行代码在其他地方都能成功执行,还是没有头绪,又加了日志打印width、height、totalline,发现这几个数据变得很大,导致函数里使用的时候出现了越界。
数据变大我以为是某个地方计算出现了问题,查了一圈感觉都不是问题的关键。继续加日志,看这几个数据是在哪里被改变了,还好我这次加日志是新写了一个函数,里面重新获取了mhm,经过对比发现,日志始终是对的,但相邻代码的width旧日志数据竟然不对。但mhm是全局变量,普通数据修改整个项目都可以取到最新值,除非是mhm指针指向发生了改变。至此我终于意识到问题,应该是mhm指针在中间某个环节被重新设置了,经过验证,确实是在若干接口调用后调到了加载接口,重新设置了mhm的地址。
查到问题之后改起来就很简单了
真是每一个举动都要考虑清楚再下手。最后,gdb + 日志,是查问题的好帮手。