linux项目调试中如果涉及很多动态链接库,动态库代码变更调整后,有时候会发现程序在执行过程中某些接口函数并没有进入变更后的接口实现中,此时就会怀疑应该是有某些旧的动态库中包含了接口函数变更前的实现,那如何定位包含旧接口实现所属的动态库就成为了解决这个问题的关键:
这个时候linux下调试利器gdb就可以出场了。
方案一:
1)gdb 挂起程序,对问题的接口函数设置断点,此时bt发现虽然可以看到代码所属文件及函数却没显示所属的库(个人不理解为啥GDB不显示代码所属的动态库呢,其他调试工具如pstack程序的时候是显示的)。
2)bt, 然后 f *** 进入问题接口函数所属的栈
3)info registers 可以看到该函数对应的rip地址
4)info sharedlibrary 查看加载的所有动态库的内存地址的起止地址
5)比较看问题函数rip落在哪个动态的地址区域里,那个库就是问题库了
方案二:
1)gdb 挂起程序,对问题的接口函数设置断点
2)info registers 可以看到该函数对应的rip地址
3)info symbol 0x7f7c081e1130(rip地址)就可以看到该函数符号的完整信息,包括所属的库信息