gdb调试

gdb调试

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

p width --打印变量width 的值

$4 = 13

你可以使用set var命令来告诉GDB, width不是你GDB的参数, 而是程序的变量名, 如:

set var width=47 // 将变量var值设置为47

在你改变程序变量取值时, 最好都使用set var格式的GDB命令。

库函数与系统函数的关系:

库函数和系统函数的关系是: 调用和被调用的关系;库函数是对系统函数的进一步封装.

虚拟地址空间:

进程的虚拟地址空间分为用户区和内核区, 其中内核区是受保护的, 用户是不能够对其进行读写操作的; 内核区中很重要的一个就是进程管理, 进程管理中有一个区域就是PCB(本质是一个结构体); PCB中有文件描述符表, 文件描述符表中存放着打开的文件描述符, 涉及到文件的IO操作都会用到这个文件描述符.

gdb调试

上一篇:Mysql除了串行化怎么解决幻读


下一篇:Mysql8.0不支持grant all privileges on *.* to root@“%“ identified by “.“;