掘金 后端 ( ) • 2024-05-14 09:31

linux程序分析命令(三)

  • **ldd:**用于打印共享库依赖。这个命令会显示出一个可执行文件所依赖的所有共享库(动态链接库),这对于解决运行时库依赖问题非常有用。
  • **nm:**用于列出对象文件的符号表。这个命令可以显示出定义和引用的符号,对于理解程序结构和调试非常有帮助。
  • objdump:显示二进制文件的信息。这个命令可以用来显示程序的汇编代码、段信息等,对于底层分析和调试很有用。
  • strace:跟踪系统调用。通过这个命令,你可以看到一个程序执行时所有的系统调用,这对于理解程序如何与操作系统交互非常重要。
  • ltrace:跟踪库函数调用。与strace类似,但是ltrace专注于跟踪程序调用库函数的情况。
  • gdb:GNU调试器。这是一个功能强大的调试工具,可以让你看到程序执行时的内部情况,比如变量的值、程序的执行流程等。
  • valgrind:内存调试工具。这个工具主要用于检测内存泄漏、内存损坏等问题,对于提高程序稳定性非常有帮助。
  • readelf:显示ELF格式文件的信息。这个命令可以显示出ELF格式的二进制文件(如Linux下的可执行文件和共享库)的详细信息,包括段、节、符号等。
  • file:确定文件类型。这个命令可以帮助你识别一个文件是二进制可执行文件、文本文件还是其他类型的文件。
  • size:显示二进制文件的段大小。这个命令会列出二进制文件各个段(如文本段、数据段)的大小,对于评估程序占用空间有一定帮助。

ltrace

ltrace是一个强大的命令行工具,用于跟踪程序执行时的库调用(例如,从共享库中调用的函数)。这对于调试和理解程序如何与系统的其他部分交互非常有用。

基本用法

跟踪程序的库调用

最基本的用法是直接运行ltrace后跟你想要跟踪的程序名

ltrace ls
#输出到文件
ltrace -o output.txt ls

高级用法

过滤特定的函数调用

使用-e 选项可以指定只跟踪的函数调用。

ltrace -e malloc+free ls

跟踪子进程

使用-f选项可以跟踪程序产生的所有子进程。

ltrace -f some_application

设置断点

ltrace允许你在特定的函数调用时暂停程序执行。

ltrace -b malloc some_application

条件过滤

可以结合使用-e选项和正则表达式来过滤只有在特定条件下才会出现的调用。

ltrace -e '.*file.*' some_application

gdb

gdb基本用法

#启动gdb
#启动没有任何程序的gdb:
gdb
#启动并加载一个程序:
gdb /path/to/program
#设置断点
#在函数开始处设置断点:
(gdb) break function_name
#在指定行号设置断点:
(gdb) break file.c:line_number
#程序执行
#开始或继续执行程序:
(gdb) run
#执行下一行代码(不进入函数):
(gdb) next
#单步执行(进入函数):
(gdb) step
#检查值
#打印变量的值:
(gdb) print variable_name
#查看栈帧:
(gdb) backtrace

gdb高级用法

#条件断点
#在特定条件下触发断点:

(gdb) break file.c:line_number if condition
##观察点
#设置观察点,当变量的值改变时暂停执行:

(gdb) watch variable_name
#调用函数
#在调试过程中调用程序的函数:

(gdb) call function_name(arguments)
#批处理模式
#使用脚本自动化gdb命令:

gdb -x script.gdb /path/to/program
##多线程调试
#列出所有线程:

(gdb) info threads
#切换到特定线程:

(gdb) thread thread_id
##远程调试
#在目标机器上启动gdbserver:

gdbserver host:port /path/to/program
#在本地机器上连接到gdbserver:

gdb /path/to/program
(gdb) target remote host:port

valgrind

Valgrind 基本用法

安装 Valgrind

在大多数Linux发行版中,可以通过包管理器安装Valgrind。例如,在Ubuntu上,可以使用以下命令安装:

sudo apt-get install valgrind

使用 Memcheck 工具检测内存泄漏

Memcheck 是Valgrind中最常用的工具,用于检测内存泄漏和错误的内存使用。使用Memcheck检测一个程序,只需在命令行中输入:

valgrind --leak-check=yes your_program arguments

Valgrind 高级用法

详细的内存泄漏报告

如果你需要更详细的内存泄漏报告,可以增加--leak-check=full参数。这将会告诉你哪些确切的数据结构和变量导致了内存泄漏:

valgrind --leak-check=full your_program arguments

检查线程错误

Valgrind的Helgrind和DRD工具可以帮助检测多线程程序中的竞争条件和死锁。使用Helgrind检查程序:

valgrind --tool=helgrind your_program arguments

调整内存泄漏报告的详细程度

使用--leak-resolution=med(或high、low)来调整报告的详细程度。高分辨率会给出更详细的信息,但可能会使输出变得难以管理:

valgrind --leak-check=full --leak-resolution=high your_program arguments

生成调用图

使用--callgrind-out-file参数来生成程序执行过程的调用图,这对于性能分析特别有用:

valgrind --tool=callgrind --callgrind-out-file=callgrind.out your_program

使用Massif工具分析堆使用情况

Massif是Valgrind的一个工具,用于分析程序在运行时堆的使用情况,帮助优化程序的内存使用:

valgrind --tool=massif your_program arguments

readelf

readelf基本用法

查看文件头信息

使用-h选项可以显示ELF文件的文件头信息,这包括了ELF版本、入口点地址、程序头表位置等信息。

readelf -h /path/to/your_program

查看节区头信息

使用-S选项可以列出ELF文件中所有节区的头信息,包括节区名称、大小、地址等。

readelf -S /path/to/your_program

查看程序头信息

使用-l选项可以显示程序头信息,这对于理解程序如何在内存中布局非常有帮助。

readelf -l /path/to/your_program

readelf高级用法

查看符号表

使用-s选项可以显示ELF文件中的符号表,这包括了函数和变量名等符号信息,对于调试和逆向工程非常有用。

readelf -s /path/to/your_program

查看重定位信息

使用-r选项可以查看文件的重定位信息,这对于理解动态链接是如何工作的非常有帮助。

readelf -r /path/to/your_program

查看动态段信息

使用-d选项可以查看动态段信息,包括了动态链接器需要的各种参数。

readelf -d /path/to/your_program

查看所有信息

如果你想要一次性查看所有可用的信息,可以使用-a选项,这将输出大量的详细信息。

readelf -a /path/to/your_program

file

file基本用法

确定单个文件的类型

最基本的用法是通过简单地将文件名作为参数来使用file命令:

file /path/to/file

这将输出该文件的类型。

同时检查多个文件

file命令也可以同时检查多个文件,只需将它们作为参数一起传递:

file file1 file2 file3

从文件列表中读取

如果你有一个包含文件名的列表,可以使用-f选项从该文件读取并检查每个文件:

file -f files.txt

其中files.txt是一个包含要检查的文件路径的文本文件。

file高级用法

检查目录

使用-d选项可以检查目录本身而不是目录中的文件: file -d /path/to/directory 输出MIME类型

使用-i或--mime选项会输出文件的MIME类型(例如,text/plain; charset=us-ascii),这对于脚本处理特别有用: file --mime /path/to/file 显示文件系统类型

使用-s选项可以显示磁盘或磁盘映像的文件系统类型:

file -s /dev/sda1

递归检查

使用-R或--recursive选项可以递归地检查目录中的所有文件:

file -R /path/to/directory

size

size基本用法

显示文件尺寸

最基本的使用方法是直接将文件名作为参数:

size /path/to/your_program

这将输出程序的文本、数据和bss段的尺寸。

同时显示多个文件尺寸

size命令可以同时处理多个文件,只需将它们作为参数一起传递:

size file1 file2 file3

使用Berkeley格式输出

默认情况下,size命令使用SysV格式输出,但你可以使用-m选项切换到Berkeley格式,这会改变输出的布局和信息:

size -m /path/to/your_program

size高级用法

输出格式

使用-A或--format=SysV选项可以显示详细的段信息,包括段名称和大小:

size -A /path/to/your_program

总结所有文件尺寸

如果你想要得到多个文件尺寸的总和,可以使用--total选项:

size --total file1 file2 file3

输出为十六进制或八进制

使用-o或-x选项可以将尺寸输出为八进制或十六进制格式,这对于某些特定的分析可能更有用:

size -x /path/to/your_program  # 十六进制
size -o /path/to/your_program  # 八进制