最近碰到一个多进程加多线程异常退出的bug,通过gdb调试找到root cause。记录以下过程。
在这个例子中,binary1调用了binary2,binary2是个多线程,bug就出在bianry2其中一个线程上。由于bianry2是在binary1中调用的,不适合使用“gdb binary”的形式进行debug,只能在程序运行之后找到birnary2的pid,然后通过pid调试。
进入调试终端后看到的都是主进程的上下文,而问题出在其中一个线程,所以要再进入对应线程调试终端。首先用info threads查看所有线程,再用thread thread_id进入相应线程上下文。这个时候就可以开始调试了。
这里有个问题。一开始bianry2进程可能还没有fork出出错的线程,用info threads是找不到对应线程的。我的办法是结合进程的log,大概定位到问题代码,然后在对应函数里面wait一段时间,这样我们在用gdb之前可以先等上一段时间,确定代码已经进入问题函数再去用gdb调试。
版权声明:本文为wujianyongw4原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。