gdb简单指令
- 若要调试一个程序,需要使用
“cc -g xx.c”
,使用 -g 编译得到的.out程序才可以被调试 - 使用
“gdb xx.out”
开始调试一个程序 - l / list : 显示源代码(直接回车表示继续执行上一个命令,下同)
- start : 启动调试,程序默认停留在main入口处,为单步调试
- r / run :启动调试,直接执行到下一个断点处
- b / break : 添加断点
- n / next : 执行下一行,但是不进入被调用函数内部
- s / step :执行下一步,进入被调用函数内部
- p / print :打印某个变量的值
- x/nd :显示内存中的n个值(默认4字节为一个值),n为个数,d为显示方式 ,此处d表示10进制显示
- bt :查看函数堆栈
- f :切换函数栈中的函数,并不改变执行过程,但可以查询另一个函数中的变量值
- q :退出调试
内存规划
C语言程序运行时会占用如下图的几个分区:
其中系统内核区主要由操作系统所使用,暂不讨论,其他分区的作用如下:
- 栈(stack):存储被调用函数的局部变量、函数参数等信息,每次函数调用时,存放返回地址和调用者信息,用于保存/恢复现场,由编译器管理,自上向下增长,可占用自由分配区;
- 堆(heap):存放运行时被动态分配内存的变量,如使用malloc/free函数即分配此部分内存,程序员管理,可自下向上增长占用自由分配区;
- 数据段(data segment):声明的全局变量,静态变量以及常量会存放在数据段(如果细分,数据段之上还存在BSS段,BSS段存放未初始化的全局变量,执行时被赋值0,数据段存放已初始化的全局变量);
- 代码段(code/text segment):应用程序被编译后生成机器码(二进制指令),在执行程序时,这些机器码被存放在代码段,代码段内容通常只读;此段也会存放常量字符串;