Linux学习笔记----进阶部分-----2,程序调试

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

strace分析系统调用

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

file文件类型查询

strings查询数据中的文本信息

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

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(十六进制输出)

 

你可能感兴趣的:(Linux,程序调试)