如何检查给定进程在运行时加载了哪些共享库?
- 2024-10-22 08:29:00
- admin 原创
- 109
问题描述:
有没有办法检查正在运行的进程正在使用哪些库?
更具体地说,如果程序使用dlopen加载某些共享库,则 readelf 或 ldd 将不会显示它。是否有可能从正在运行的进程中获取该信息?如果可以,如何获取?
解决方案 1:
其他人的做法是正确的。以下是几种方法。
cat /proc/NNNN/maps | awk '{print $6}' | grep '.so' | sort | uniq
或者,使用 strace:
strace CMD.... 2>&1 | grep -E '^open(at)?(.*.so'
这两个都假设共享库的路径中某处有“.so”,但您可以修改它。第一个给出的输出相当漂亮,只是库的列表,每行一个。第二个将在打开库时继续列出它们,所以这很好。
当然lsof
......
lsof -p NNNN | awk '{print $9}' | grep '.so'
解决方案 2:
也许lsof
——Linux这把瑞士军刀会有帮助?
编辑:运行时lsof -p <pid>
,列出各种有用的信息,例如,如果进程是 java,则列出所有打开的 jar - 非常酷...
解决方案 3:
实际上,您可以按照以下方式在代码中执行此操作:
#include <link.h>
using UnknownStruct = struct unknown_struct {
void* pointers[3];
struct unknown_struct* ptr;
};
using LinkMap = struct link_map;
auto* handle = dlopen(NULL, RTLD_NOW);
auto* p = reinterpret_cast<UnknownStruct*>(handle)->ptr;
auto* map = reinterpret_cast<LinkMap*>(p->ptr);
while (map) {
std::cout << map->l_name << std::endl;
// do something with |map| like with handle, returned by |dlopen()|.
map = map->l_next;
}
该结构至少包含基地址和绝对文件名。它是第一个参数非 NULL 时link_map
实际返回的结构。有关更多详细信息,请参阅此处。dlopen()
解决方案 4:
ltrace
似乎是你的朋友。
来自ltrace
手册:
ltrace 是一个只运行指定命令直到退出的程序。它拦截并记录执行进程调用的动态库调用以及该进程收到的信号。它还可以拦截并打印程序执行的系统调用。
Its use is very similar to strace(1).
解决方案 5:
在 Linux 上,/proc/<processid>/maps
包含映射到内存的所有文件的列表,我相信其中应该包括任何由 加载的文件dlopen()
。
解决方案 6:
在 solaris 上还有 pldd 命令。
解决方案 7:
您可以在 Linux 上以编程方式执行此操作。您可以使用函数dl_iterate_phdr
。
以下是取自手册页的一个小例子:
#define _GNU_SOURCE
#include <link.h>
#include <stdlib.h>
#include <stdio.h>
static int
callback(struct dl_phdr_info *info, size_t size, void *data)
{
int j;
printf("name=%s (%d segments)
", info->dlpi_name,
info->dlpi_phnum);
for (j = 0; j < info->dlpi_phnum; j++)
printf(" header %2d: address=%10p
", j,
(void *) (info->dlpi_addr + info->dlpi_phdr[j].p_vaddr));
return 0;
}
int
main(int argc, char *argv[])
{
dl_iterate_phdr(callback, NULL);
exit(EXIT_SUCCESS);
}
解决方案 8:
会strace
跟踪正在打开的库文件吗?
解决方案 9:
问题是你是否想了解外部进程:
$ sleep 1h&p=$!;sleep 0.1;gdb -p $p -batch -ex 'info shared'
[1] 637756
...
From To Syms Read Shared Object Library
0x00007f795ffc4700 0x00007f7960135aed Yes /lib64/libc.so.6
0x00007f79601cc0a0 0x00007f79601f2d35 Yes /lib64/ld-linux-x86-64.so.2
[Inferior 1 (process 637756) detached]
或者关于您自己的流程:
#include <iostream>
#include <link.h>
#include <cassert>
#include <dlfcn.h>
int main() {
// prevent R_X86_64_COPY and r_state inconsistency if we accessed "_r_debug" directly.
r_debug *debug = (r_debug *) dlsym(RTLD_DEFAULT, "_r_debug");
assert(debug);
assert(debug->r_version == 1);
assert(debug->r_state == r_debug::RT_CONSISTENT);
link_map *prev = NULL;
for (link_map *map = debug->r_map; map; prev = map, map = map->l_next) {
assert(map->l_prev == prev);
std::cout << map << " " << (!map->l_name[0] ? "<empty>" : map->l_name) << std::endl;
}
}
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD