目录
- Linux看进程里的线程信息
- 查看/proc/直接读取内核信息
- 使用ps查看线程内存
- 使用top动态监控线程内存
- 使用htop(更友好的交互式工具)
- 使用pmap查看线程的详细内存映射
- 使用valgrind(高级内存分析)
- 结合 gdb 调试线程
- Linux下查看二进制文件信息
- nm
- objdump
- readelf
- file
- ldd
- Linux查找
- find
- grep
- which
- whereis
- locate
- C api错误码
- 标题
- 标题
- Linux目录结构
- 根目录
- 系统核心目录
- 用户相关目录
- 临时与挂载目录
Linux看进程里的线程信息
获取进程PID的一些方法:
psaux|grepprocess_name pidof process_name# 适用于精确匹配程序名pgrep-fprocess_name# 简洁列出所有线程ID(TID)的一些方法:
ls/proc/<PID>/task/# 一般输出主线程 + 子线程ps-eLf|grep"<PID>"ps-T-p<PID># SPID是线程IDps-L<pid># LWP(轻量级进程ID,即线程 ID)pstree-p<pid># 以树形结构展示进程和线程的层级关系,清晰直观查看/proc/直接读取内核信息
proc/<PID/cmdline是一个只读文件,包含进程的完整命令行信息。如果这个进程是zombie进程,则这个文件没有任何内容。
/proc/<PID>/comm包含进程的命令名。
/proc/<PID>/environ显示进程的环境变量。
/proc/<PID/fd是一个目录,包含进程打开文件的情况。
/proc/<PID/latency显示哪些代码造成的延时比较大。
/proc/<PID/maps显示进程的内存区域映射信息。
每个线程的内存信息存储在 /proc/<PID>/task/<TID>/status 中,关键字段包括:
- VmRSS:实际使用的物理内存(Resident Set Size)。
- VmSize:虚拟内存大小(包括共享库、堆、栈等)。
- VmStk:栈内存大小。
- VmData:数据段内存大小。
- VmExe:可执行文件占用的内存。
查看每个线程的内存占用:
cat/proc/<PID>/task/<TID>/status|grep-E"VmRSS|VmSize"批量查看所有线程的内存(脚本示例):
PID=12345forTIDin$(ls/proc/$PID/task/);doecho-n"Thread$TID: "grep-E"VmRSS|VmSize"/proc/$PID/task/$TID/statusdone使用ps查看线程内存
ps 命令可以显示线程的 RSS(物理内存占用)和 VSZ(虚拟内存占用):
ps-eLf--sort=-rss|grep"process_name"或更详细地显示所有线程的内存:
ps-opid,tid,rss,vsz,cmd-L-p<PID>使用top动态监控线程内存
top -H 可以实时查看线程的内存占用:
top-H-p<PID>- 按Shift + E 切换内存单位(KB/MB/GB…),按Shift + M 按内存排序,按Shift + H 键在进程视图和线程视图之间切换
- VIRT = VmSize:virtual memory usage 虚拟内存
- 进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
- 假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
- RES = VmRSS:resident memory usage 常驻内存/物理内存
- 进程当前使用的内存大小,但不包括swap out
- 包含其他进程的共享
- 如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
- 关于库占用内存的情况,它只统计加载的库文件所占内存大小
- SHR:shared memory 共享内存
- 除了自身进程的共享内存,也包括其他进程的共享内存
- 虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
- 计算某个进程所占的物理内存大小公式:RES – SHR
- swap out后,它将会降下来
使用htop(更友好的交互式工具)
htop是top的增强版,可交互式查看线程内存:
- 在命令终端直接输入
htop - 按 F2 → Display Options → 勾选 “Show custom thread names” 和 “Highlight threads”
- F5(树形视图)、F6(按内存排序)、F4(输入PID过滤目标进程)
htop-p<pid># 直接过滤指定进程,查看其线程使用pmap查看线程的详细内存映射
pmap 可以显示每个线程的内存映射情况,但并不是所有系统都支持
pmap-x<TID># 查看 TID 的内存映射使用valgrind(高级内存分析)
如果需要更详细的内存泄漏分析,可以使用 valgrind:
valgrind--tool=massif ./test_program然后使用 ms_print 分析结果:
ms_print massif.out.<PID>#massif.out.<PID>文件可先在当前路径下找结合 gdb 调试线程
如果需要调试线程,可以使用gdb:
gdb-p<PID>然后在 gdb 中:
- info threads:查看所有线程
- thread N:切换到线程 N(N指前面的序号)
- bt:查看线程调用栈
oom_score_adj 参考:https://www.jianshu.com/p/bbaeff371019
Linux下查看二进制文件信息
nm
查看二进制文件里的符号信息(函数名、变量名等符号及其类型和地址)
- 用途:找函数是否存在、变量是否定义、排查未定义引用
- 常用选项:
- -C:对C++符号进行解码,使其更易读
- -D:显示动态符号(用于动态库)
objdump
用于显示二进制文件的详细信息
- 主要功能包括反汇编、查看文件头、节信息、符号表、重定位信息等
- 常用选项:
- -d:以汇编代码形式显示代码段(反汇编)
- -S:显示源代码与汇编代码的混合模式
- -f:显示文件头信息(文件类型、架构、入口点等)
- -x:显示所有头信息
readelf
专门查看 ELF(Executable and Linkable Format)文件(Linux 标准二进制格式)详细信息,如文件头、节表、符号表等
- 用途:分析 ELF 结构、查看依赖库、检查文件格式
- 常用选项:
- -h:显示ELF文件头信息(类型、架构、入口地址等)
- -S:显示节信息(.text、.data、.rodata等)
- -l:显示程序头表信息(内存布局和加载方式)
- -s:显示符号表信息(函数、全局变量等)
- -d:显示动态段(依赖库、RPATH、SONAME等)
file
根据文件的内容而非扩展名来判断文件的实际类型,例如判断一个未知文件是否可执行文件、脚本、动态/静态链接、是否stripped…
ldd
用于显示程序或共享库所依赖的动态链接库
等同于 objdump -x lib***.so | grep NEEDED
Linux查找
find
- 实时遍历磁盘,按条件(名称、类型、大小、时间等)查找文件 / 目录
- 例如:find /home -name “*.txt”(查找/home下所有.txt文件)
grep
- 在文件中搜索指定字符串 / 正则,过滤文本
- 例如:grep “error” /var/log/syslog(在日志文件中查找包含"error"的行)
which
- 在系统的PATH环境变量中查找命令的完整路径
- 仅搜索可执行文件
- 例如:which ls(显示ls命令的完整路径)
whereis
- 查找命令的二进制文件、源代码和帮助文件路径
- 搜索范围比which更广
- 例如:whereis gcc(显示gcc命令的可执行文件、源码和帮助文件路径)
locate
- 基于数据库的快速文件搜索工具
- 比find更快但非实时,因为它搜索的是预先构建的文件索引数据库
- 需要先运行updatedb更新数据库
- 例如:locate config(快速查找包含config的文件路径)
find功能最全面但速度较慢,locate最快但需要更新数据库,grep用于文本内容搜索,which和whereis主要用于查找命令路径。
C api错误码
调用linux C api函数发生异常时,一般会将errno变量(需include <errno.h>)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因
例:
fd = open() if (fd < 0) { perror("Open"); }错误码参考:https://blog.csdn.net/weixin_29345997/article/details/116728892
标题
- 内容
标题
- 内容
Linux目录结构
Linux采用树形层次目录体系,所有文件和目录从根目录(/)开始分支延伸。ls /得到Linux目录:
根目录
- /:整个文件系统的起点,所有其他目录和文件都从这里开始
系统核心目录
- /bin:存放所有用户都能使用的基本命令二进制文件(如ls、cp、mv、rm等)
- /sbin:存放仅系统管理员(root)使用的系统管理命令(如reboot、shutdown等)
- /boot:存放系统启动相关文件,Linux内核文件、引导加载程序等
- /dev:存放设备文件,将硬件设备抽象为文件形式(如硬盘
/dev/sda、键盘/dev/tty、U盘/dev/sdb) - /etc:存放系统全局配置文件,无二进制程序(如
/etc/passwd、/etc/hosts等) - /lib:存放系统运行(如
/bin和/sbin命令)所需的共享库文件(.so),类似 Windows 的 DLL。 - /lib64:64 位系统专用库目录
- /proc:虚拟文件系统,实时显示内核和进程信息(如
/proc/cpuinfo、/proc/meminfo),不占实际磁盘 - /sys:虚拟文件系统,提供内核和设备的详细信息(管理硬件设备的内核接口),不占实际磁盘
- /usr:Unix Software Resource,存放用户应用程序、库文件及源码等
- /usr/bin:更多用户命令
- /usr/sbin:更多系统管理命令
- /usr/lib:应用库
- /usr/share:文档、图标、帮助等共享数据
- /usr/local:手动编译安装软件的默认位置
用户相关目录
- /home:普通用户主目录,每个用户有独立的子目录(如
/home/zhangsan),存放用户文件、配置。 - /root:系统管理员(超级权限用户)的主目录,为了安全,独立于普通用户,不放在
/home下。
临时与挂载目录
- /media:系统自动挂载可移动设备(如U盘、光盘、移动硬盘)的目录
- /mnt:管理员临时手动挂载其他文件系统的目录(如挂载硬盘、网络共享)
- /opt:存放可选的附加软件包,通常是第三方大型软件安装地(如Oracle、Chrome)
- /tmp:存放临时文件,系统重启后会被清空
- /run:系统运行时临时数据(进程 PID、锁文件、套接字),重启后重建
- /var:存放经常变化的文件,如日志文件
/var/log、缓存文件/var/cache等 - /srv:存放本机服务提供的数据(如网站文件、FTP 共享数据)
本文内容参考公开技术文档,如有侵权请联系删除。