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 # 八进制