GDB调试

基本命令

以下是一些在 Linux 中使用 gdb 进行调试时常用的基本命令(下面的每一个命令都可以简写为命令首字母):

  1. gdb :启动 gdb 调试器,并指定要调试的可执行文件。

  2. runr:运行程序。

  3. break b :在指定的位置设置断点,可以是函数名、行号或文件名。

  4. continuec:继续执行程序,直到下一个断点或程序结束。

  5. nextn:执行下一行代码,但不会进入函数内部

  6. steps:执行下一行代码,并进入函数内部

  7. print p :打印变量的值。

  8. info locals:显示当前上下文的局部变量。

  9. backtracebt:显示函数调用堆栈。

  10. quitq:退出 gdb 调试器。

  11. listl:显示当前位置附近的源代码。

  12. set var = :设置变量的值。

  13. display :持续显示某个变量的值。

  14. break :在指定的函数内设置断点。

  15. delete breakpoints:删除所有断点。

这些命令只是 gdb 的基本命令,还有更多高级的命令和选项可用于调试。

步骤(gdb普通文件)

第一步:gcc -g xxx 生成调试信息(如果不加 -g 的话是使用不了 gdb 的

第二步:由第一步产生的可执行文件 a.out (如果指定了别的可执行文件也可以使用它的文件名)进行 gdb a.out 进行执行

第三步:l(小写 L)查看文件内容

第四步:设置断点 b xxx (行号),b 后面可以跟 main,这样会自动设置一个 main 函数中的断点

第五步:r (运行代码)

第六步:可以 c (继续执行完代码) / 可以 n (一步一步执行,但是已经 c 完的代码,还需要 r 一下

第七步:n 的过程中可以 p (打印)变量的值,一直 n 的话会继续一步步执行直到退出程序,如果要进入某个函数查看的话这样不符合需求,因为 n 会跳过进入函数,直接运行出函数结果,所以这个时候就需要 n 到函数位置时 s,进去函数以后再 n如果里面还有要看的函数再 s,否则就是继续 n

步骤(gdb core文件)

第一步:正常运行(非GDB)代码后出现 Segmentation fault (core dumped) 错误后,就会生成 core 文件(但这个文件不一定就是和刚刚执行的文件匹配,所以可以先删除一下之前的 core 文件,然后加上 -g 重新生成调试信息 和 core 文件),如果想要 gdb 调试的话,一定要加上 -g 编译,否则 gdb 出的信息定位不准确。

第二步:把第一步生成的默认可执行文件(其它可执行文件也行)和 core 文件放一起 gdb:gdb a.out core

第三步:一般 enter 一下进行调试信息页面就能看到这个段错误(Segmentation fault )发生在哪一行代码了:
GDB调试_第1张图片
从上图可以看到,段错误发生在 test.c 文件的第 31 行,然后再结合上下文分析段错误具体原因即可。

步骤(gdb 调试正在运行的进程)

第一步:先必须保证有一个正在运行的进程(也是需要 -g 生成调试信息)

第二步:利用 ps aux | grep 进程名 命令查找该进程的进程 ID

第三步:gdb 执行文件名(默认 a.out) -p 进程ID

第四步:同 gdb 普通文件步骤

你可能感兴趣的:(linux,运维,c语言)