1,进程调试
gdb程序交互调试
GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于,命令行的、功能强大的程序调试工具。
以下从一个完整的调试过程简单说明最基本的几个命令;
$gdb programmer # 启动gdb >break main # 设置断点 >run # 运行调试程序 >next # 单步调试 >print var1 # 在调试过程中,我们需要查看当前某个变量值的时候,使用print 命令打印该值 >list # 显示当前调试处的源代码 >info b # 显示当前断点设置情况
当你完成了第一个程序调试之后,你当然会需要更多的命令:关于gdb常用命令及各种调试方法后续会详细介绍 ;
同时,你需要更高效的调试:常用的调试命令都会有单字符的缩写,使用缩写更方便;同时,直接敲回车表示重复执行上一步命令;这在单步调试时非常有用;
pstack跟踪栈空间
pstack是一个脚本工具,可显示每个进程的栈跟踪。pstack 命令必须由相应进程的属主或 root 运行。其核心实现就是使用了gdb以及thread apply all bt命令; 语法:pstrack <program-pid>。
strace分析系统调用
strace常用来跟踪进程执行时的系统调用和所接收的信号。在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
file文件类型查询
strings查询数据中的文本信息
一个文件中包含二进制数据和文本数据,如果只需要查看其文本信息,使用这个命令就很方便;过滤掉非字符数据,将文本信息输出:$strings <objfile>
fuser显示文件使用者
显示所有正在使用着指定的file, file system 或者 sockets的进程信息。
xxd十六进制显示数据
od
通常使用od命令查看特殊格式的文件内容。通过指定该命令的不同选项可以以十进制、八进制、十六进制和ASCII码来显示文件。
参数说明:
-A 指定地址基数,包括:
- d 十进制
- o 八进制(系统默认值)
- x 十六进制
- n 不打印位移值
-t 指定数据的显示格式,主要的参数有:
- c ASCII字符或反斜杠序列
- d 有符号十进制数
- f 浮点数
- o 八进制(系统默认值为02)
- u 无符号十进制数
- x 十六进制数
除了选项c以外的其他选项后面都可以跟一个十进制数n,指定每个显示值所包含的字节数。
说明:od命令系统默认的显示方式是八进制,这也是该命令的名称由来(Octal Dump)。但这不是最有用的显示方式,用ASCII码和十六进制组合的方式能提供更有价值的信息输出。
以十六进制和字符同时显示:
$od -Ax -tcx4 a.c 000000 # i n c l u d e < s t d i o . 636e6923 6564756c 74733c20 2e6f6964 000010 h > \n \n v o i d m a i n ( ) \n 0a0a3e68 64696f76 69616d20 0a29286e 000020 { \n \t i n t i = 5 ; \n \t p 69090a7b 6920746e 35203d20 70090a3b 000030 r i n t f ( " h e l l o , % d " 746e6972 68222866 6f6c6c65 2264252c 000040 , i ) ; \n } \n 3b29692c 000a7d0a 000047
以字符方式显示:
$od -c a.c 0000000 # i n c l u d e < s t d i o . 0000020 h > \n \n v o i d m a i n ( ) \n 0000040 { \n \t i n t i = 5 ; \n \t p 0000060 r i n t f ( " h e l l o , % d " 0000100 , i ) ; \n } \n 0000107
注:类似命令还有hexdump(十六进制输出)