linuxtools-develop

 

 

查询应用程序需要链接的库:

$ldd myprogrammer     libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000039a7e00000)     libm.so.6 => /lib64/libm.so.6 (0x0000003996400000)     libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000039a5600000)     libc.so.6 => /lib64/libc.so.6 (0x0000003995800000)     /lib64/ld-linux-x86-64.so.2 (0x0000003995400000)

 

2.1. 进程调试

gdb  程序交互调试

GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。

对于一名Linux下工作的c++程序员,gdb是必不可少的工具;

GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。

以下从一个完整的调试过程简单说明最基本的几个命令;

$gdb programmer     # 启动gdb >break main         # 设置断点 >run                # 运行调试程序 >next               # 单步调试 >print var1         # 在调试过程中,我们需要查看当前某个变量值的时候,使用print 命令打印该值 >list               # 显示当前调试处的源代码 >info b             # 显示当前断点设置情况

 

pstack 跟踪栈空间

pstack是一个脚本工具,可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。其核心实现就是使用了gdb以及thread apply all bt命令;

 

strace 分析系统调用

strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

 

完整程序:

strace -o output.txt -T -tt -e trace=all -p 28979

 

2.2. 目标文件分析

nm

nm用来列出目标文件的符号清单。

  • A 表示绝对 (absolute),这意味着不能将该值更改为其他的连接;
  • B 表示 BSS 段中的符号;
  • C 表示引用未初始化的数据的一般符号。

可以将目标文件中所包含的不同的部分划分为段。段可以包含可执行代码、符号名称、初始数据值和许多其他类型的数据。有关这些类型的数据的详细信息,可以阅读 UNIX 中 nm 的 man 页面,其中按照该命令输出中的字符编码分别对每种类型进行了描述。

在目标文件阶段,即使是一个简单的 Hello World 程序,其中也包含了大量的细节信息。nm 程序可用于列举符号及其类型和值,但是,要更仔细地研究目标文件中这些命名段的内容,需要使用功能更强大的工具。

其中两种功能强大的工具是 objdump 和 readelf 程序。

 

每个可执行代码段将在需要特定的事件时执行,这些事件包括库的初始化和该程序本身主入口点。

对于那些着迷于底层编程细节的程序员来说,这是一个功能非常强大的工具,可用于研究编译器和汇编器的输出。细节信息,比如这段代码中所显示的这些信息,可以揭示有关本地处理器本身运行方式的很多内容。对该处理器制造商提供的技术文档进行深入的研究,您可以收集关于一些有价值的信息,通过这些信息可以深入地了解内部的运行机制,因为功能程序提供了清晰的输出。

 

readelf

这个工具和objdump命令提供的功能类似,但是它显示的信息更为具体,并且它不依赖BFD库(BFD库是一个GNU项目,它的目标就是希望通过一种统一的接口来处理不同的目标文件);

 

size 查看程序内存占用

size这个工具用来查看程序运行时各个段的实际内存占用:

$size a.out text           data     bss     dec     hex filename 1146            256       8    1410     582 a.out

 

file 文件类型查询

这个工具用于查看文件的类型;

 

strings 查询数据中的文本信息

一个文件中包含二进制数据和文本数据,如果只需要查看其文本信息,使用这个命令就很方便;过滤掉非字符数据,将文本信息输出:

$strings <objfile>

 

fuser 显示文件使用者

显示所有正在使用着指定的file, file system 或者 sockets的进程信息;

$fuser -m -u redis-server

fuser通常被用在诊断系统的”resource busy”问题。如果你希望kill所有正在使用某一指定的file, file system or sockets的进程的时候,你可以使用-k选项:

$fuser –k /path/to/your/filename

 

xxd 十六进制显示数据

以十六进制方式显示文件,只显示文本信息:

 

od

通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。

参数说明:

-A 指定地址基数,包括:

  • d 十进制
  • o 八进制(系统默认值)
  • x 十六进制
  • n 不打印位移值

-t 指定数据的显示格式,主要的参数有:

  • c ASCII字符或反斜杠序列
  • d 有符号十进制数
  • f 浮点数
  • o 八进制(系统默认值为02
  • u 无符号十进制数
  • x 十六进制数

除了选项c以外的其他选项后面都可以跟一个十进制数n,指定每个显示值所包含的字节数。

说明:od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal Dump)。但这不是最有用的显示方式,用ASCII码和十六进制组合的方式能提供更有价值的信息输出。

以十六进制和字符同时显示:


猜你喜欢

转载自www.cnblogs.com/lizhensheng/p/11117177.html