1.简介gdb调试工具1.1程序发布版本
通常,程序发布有两种版本:调试模式(debug)和发布模式(release)。在linux中,使用gcc/g++编译时,默认生成的是release模式。要使用gdb进行调试,必须在编译时加入-g选项,以便生成debug模式的程序。
1.2前期准备
开始调试前,需要安装gdb和搭建环境。gdb通常是系统自带的,可以通过gdb –version命令检查其是否存在及版本信息。
环境准备包括准备一个可用的源文件,这里以mycode.c为例,其生成的程序将标记为mycode。
以下是一个简单的c语言代码示例,作为mycode.c的内容:
在编译时,-g选项表示生成的是调试版本,Makefile文件的其他内容保持不变。
1.3调试的开始与结束
启动gdb调试只需在gdb命令后加上当前目录下的生成文件名。看到gdb提示符(gdb)和闪烁的光标,即可输入调试命令。
输入q并按下回车键,即可结束调试过程。
1.4调试相关命令1.4.1设置断点
这里的7和8表示程序的第7行和第8行设置断点。
1.4.2单步执行
使用next命令,程序会按代码顺序逐行执行。
1.4.3运行程序
使用run命令启动程序,运行到断点处暂停。
1.4.4查看变量值
使用print x命令查看变量x的值。
1.4.5断点间跳转
使用continue命令可从第一个断点直接跳转到第二个断点。
1.4.6查看调试程序代码
使用l 0命令从第0行开始显示代码,多次执行l命令会逐步显示所有代码。
2.进程入门2.1简要回顾
上次我们讨论了操作系统及其与硬件架构的层级关系。操作系统通过驱动程序管理软硬件资源,并通过描述和组织的方式实现对这些资源的管理。
2.2进程初识
加载到操作系统中的程序就是进程。操作系统可以同时运行多个进程。
当需要加载多个进程时,操作系统需要管理这些进程,管理方式是先描述后组织。
当一个进程加载到内存中成为真正的进程时,操作系统会创建一个描述进程的结构体对象,称为PCB(进程控制块)。PCB类似于面向对象编程中的对象,包含进程的所有属性。
2.3进程属性
PCB包含状态、进程编号、优先级等属性。
根据PCB,操作系统会将进程的代码和数据加载到内存中。
进程=内核PCB+自己的数据和代码。
管理多个进程类似于对单链表进行增删查改操作。
PCB中包含指向代码和数据的指针,操作系统只需管理PCB,PCB则管理代码和数据。
多个进程通过指针连接成链表,进程管理相当于对链表进行增删查改操作。每个PCB仅管理自己的数据和代码,排队时是PCB在排队,当轮到某个PCB时,它会调用自己的数据和代码。
2.3Linux中的PCB
在Linux中,task_struct是PCB的一种数据类型,包含标识符、状态、优先级、程序计数器、上下文数据、I/O状态记录、内存指针等属性。
Linux使用双向链表组织进程。
2.4查看进程
使用ls /proc命令查看进程,/proc是Linux中的一个目录。
当前目录概念:创建文件时,若未指定位置,系统会在当前目录下自动创建文件,因为进程记住自己的目录位置。
使用kill -9 进程编号命令可以终止进程。
2.5查看进程标识符
进程标识符是进程的一个属性,可以使用getpid系统调用查看当前进程的标识符,使用getppid查看父进程的标识符。
任何进程都是bash进程的子进程,bash进程是所有进程的父进程,可以通过相应命令查看其标识符。
2.6创建进程
运行程序时会生成一个进程。
使用fork系统调用可以创建新进程,fork返回两个值,父子进程共享代码,但数据在各自的内存空间中独立存在。