在obs 源码打印日志,但是编译后未打印的问题分析

5 篇文章 0 订阅

在obs 源码打印日志,但是编译后未打印

在一次分析obs源码过程中,遇到了这样一个问题,我在源码中打印了日志,但是编译后的产物却跟未改动一样。

初步定位问题

初步怀疑是因为编译产物没有删除干净,或者cmake的锁导致没有编译到该文件,于是删除了构建目录,从源码重新执行cmake和make, 然后运行程序,发现我的改动依然没有生效。源码
日志

是否有编译该文件

故意在该文件产生一个语法错误,再次编译,发现编译失败,这样就可以排除未被编译的错误了,那么就只能是编译了,但是没有使用到。这种应该就是编译成.so文件了。
再次使用strings 命令检查字符串,并用grep 过滤我加上的日志字符串,发现没有搜索到,这样就更进一步确认了这个文件编译在.so文件里面。

分析产物位置

使用find 搜索编译目录所有的.so, 找到一个名称和.c文件名称很相近的文件, 使用ldd打印链接文件列表,未发现到该文件。
对该so文件使用nm -C ,并用grep过滤修改的函数名,果然查找到了对应的函数名符号。

分析链接文件的地址

对可执行文件使用ldd命,并grep过滤刚刚查找到的so文件名,但是奇怪的是未发现该.so文件。
猜测是使用了运行时加载的技术,程序会在运行时,动态判断应该调用哪个.so文件。
于是将程序运行起来,使用pidof <程序名> 找到对应pid,然后使用lsof -p | grep <so库名>, 找到了链接的位置,发现了链接位置为 /usr/local/lib/obs-plugins/linux-capture.so。

结果

其实问题已经很清楚了,我编译的so文件在我的构建目录下面,但是真正链接的却在系统路径下面,导致我无论怎么改变都无济于事。
这个问题原因我猜是我之前使用系统包管理器安装过该软件,现在使用源码构建,但是会优先拉系统目录的库,导致了这个bug。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值