我有一个现代Linux桌面,有许多进程同时运行.其中一个进程,我不知道哪一个,从一个流行的动态库some_lib调用一个函数some_func(想想libc或libx11,所以很多进程都使用它),我想知道那个进程做了什么(和理想情况下,每个调用都有一个堆栈跟踪).
如何确定哪个进程调用some_lib?
到目前为止我考虑过的选项:
>使用ltrace或latrace:具有ltrace样式的详细列表
什么过程称为我感兴趣的功能
参数是完美的,但ltrace只适用于
个别流程或流程组.我不能只输入ltrace -e
some_func @ some_lib -fp 1并查看系统范围内的所有用途.
>使用lsof查找哪些进程使用我的库,然后继续执行步骤1:这将非常麻烦,因为有太多进程使用相同的库,但没有调用所述函数.
> grep -r some_func / usr,然后查看是否只有几个二进制文件能够调用该函数,并从那里开始工作.虽然这可以在一些有限数量的情况下起作用,但这绝不是一般解决方案,并且如果例如,则不起作用. some_func在各种二进制文件中无处不在,但很少被调用.
>使用内核审计系统.如果我正在跟踪系统调用,我可以键入auditctl -S some_syscall …这样就可以记录系统范围的调用.但是,auditctl似乎无法使用库函数执行相同级别的粒度.
>最后,我可以重建库,为我感兴趣的函数添加一个新行,它将记录所有调用.虽然这可以保证解决我的问题,但这个解决方案很麻烦,需要修改/重新编译库,并且至少需要重新启动2次才能推出已检测的库,并在找到罪魁祸首后将其回滚.
有没有更简单的方法?
(我想指出这是一个普遍的问题,而且我最感兴趣的是能够正常工作的一般解决方案.)
我找到了一个很好的comparison article,提到了一些我不知道的追踪设施,这可能值得探索.