第一次解BUG,有感

it2022-05-05  147

  刚工作,就给我安排解决BUG。刚解到第二个,就难了我很久————大概一个月。这是一个“奇怪”的BUG,至今还有很多疑问。

1.现象描述:基于C/S架构的一个远程设备管理系统。能在server端对client端开关机操作。但是有时(5次就会有)重启后client就挂了。

2.解决流程回顾:

  step1.按照现象重搭环境:client[centos 6.5] + server[windows 7]----------几十次重启无现象,与设备有关?

  step2.远端原BUG环境:client[centos 6.5] + server[windows 7]----------数次重启出现现象。 

  step3.dd出BUG镜像并dd到本地:数次重启出现现象,与系统有关?!

  step4.发现client端需要调用两个自己写的共享库[lib3,lib4],只要没有lib3就不会出问题。库使用c/C++写的,clint和server用C#;在 Linux上用mono制作成可脱离mono环境运行的可执行文件。

  step5.既然挂了无非程序退出或者被系统杀死(可能性大);由于是服务进程,开启core文件生成可得知情况,发现被11号信号杀死(段错误)。

  step6.可能是lib3的问题,获取源码加打印信息(函数首尾加打印信息到文件);结果该打印的地方都打印了。貌似在lib3返回到C#部分或者之后出问题了。放到自己做的centos6.5上试试,结果这个lib3的库压根没有运行[显示缺少系统库支持libx86-devel]。那么问题来了--之前在上面测试就没有走lib3;于是发现还有lib2,真是太糟糕了(也怪自己之前没有问问这个软件的依赖)!询问得知:

  目前的依赖关系:

          

  就是说两条通路都能达到目的。其中lib3的路有问题。然后我在自己做的centos6.5上去掉lib2通路,装上支持的运行库libx86-devel后。BUG现象100%出现。确实lib3有问题。但是打印信息显示lib3的函数都有正确执行!!

  难道是返回[return]时出问题了,这种情况就是破坏了堆栈信息。也就是破坏了返回地址,或着桟帧的栈底指针ebp。于是采用内嵌汇编的方式得到这两个值,在函数开始和返回前打印,内嵌汇编部分如下:  

1 int addr = 0; 2 int ebp = 0; 3 __asm__ __volatile__( 4 "movl 4(%
转载请注明原文地址: https://win8.8miu.com/read-22194.html

最新回复(0)