gdb调试 : gdb是在程序运行的结果与预期不符合的时候, 可以使用gdb进行调试, 特别注意的是: 使用gdb调试需要在编译的时候加-g参数.
gcc -g -c hello.c
gcc -o hello hello.o
启动gdb:
gdb program set args hello world //设置命令行输入内容 show args
执行程序:
run //直接跑完代码 start //跑第一行代码
list:显示代码
list //显示当前行后面的源程序 list - //显示当前文件开始出的源程序 list func //显示某函数的源程序 list linenum //显示某一行的上下文内容 list file:func //显示其他文件中的函数的源程序 list file:linenum //显示其他文件下第n行
//一般是打印当前行上5行,下5行,如果显示函数是上2行下8行,默认是10行,当然也可以定制显示范围
set listsize n //设置一次显示代码的行数 show listsize 这里的list可以简写为小写的L
断点操作:
b linenum //在某行加断点 b func //给某个函数加断点 b file:linenum //给别的文件的行数 b file:func //给别的文件的函数
info break //查看断点
?
disable x //使第x个断点无效
disable m n | m-n //使m到n的断点无效,如果不连续就分开
enable m n | m-n //使m到n的断点生效
?
delete m n | m-n //删除m到n的断点
条件断点:
一般来说, 为断点设置一个条件, 我们使用if关键词, 后面跟其断点条件。设置一个条件断点:
b test.c:8 if intValue == 5;//当intValue==5的时候就设置断点
调试命令:
run 执行程序 start 从程序的第一行执行程序 next 单步跟踪 函数调用自己执行不进入 可简写为n step 单步跟踪 函数调用会跟踪进去单步执行可简写为s finish 退出进入的函数,如果出不去,可以看函数体的循环中是否有断点 until 在循环体里单步跟踪时,这个命令可以运行程序直到退出循环,可简写为U,如果出不去,看一下是否循环中有断点
continue 继续运行,可以简写为c,若有断点则跳到下一个断点的位置。
print var//查看变量的值也可以用 print的简写p来处理
自动显示:
display var //自动显示变量var的值
info display
?
disable display m n | m-n
enable display m n | m-n
?
delete display m n | m-n
undisplay m n | m-n
delete display //删除所有
查看修改变量名:
ptype width --查看变量width的类型
type = double
$4 = 13
你可以使用set var命令来告诉GDB, width不是你GDB的参数, 而是程序的变量名, 如:
set var width=47 // 将变量var值设置为47
在你改变程序变量取值时, 最好都使用set var格式的GDB命令。
库函数与系统函数的关系:
库函数和系统函数的关系是: 调用和被调用的关系;库函数是对系统函数的进一步封装.
虚拟地址空间:
进程的虚拟地址空间分为用户区和内核区, 其中内核区是受保护的, 用户是不能够对其进行读写操作的; 内核区中很重要的一个就是进程管理, 进程管理中有一个区域就是PCB(本质是一个结构体);