GDB是什么:
GDB 全称“GNU symbolic debugger”,从名称上不难看出,它诞生于 GNU 计划(同时诞生的还有 GCC、Emacs 等),是 Linux 下常用的程序调试器。发展至今,GDB 已经迭代了诸多个版本,当下的 GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada等。
安装:
ubuntu下就是sudo apt install gdb
需要gdb调试的文件,编译的时候要要加上选项 -g
调试
进入GDB调试命令:
1,gdb [需要调试的文件]
这个文件是编译好了的文件
这种方式进入会显示很多信息
2,gdb [filename] -q
这个命令就不会显示很多命令
退出:quit
基本调试命令:
链接
调试命令 (缩写) 作用
(gdb) break (b) 在源代码指定的某一行设置断点,其中xxx用于指定具体打断点位置
(gdb) run (r) 执行被调试的程序,其会自动在第一个断点处暂停执行。
(gdb) continue (c) 当程序在某一断点处停止后,用该指令可以继续执行,直至遇到断点或者程序结束。
(gdb) next (n) 令程序一行代码一行代码的执行。
(gdb) step(s) 如果有调用函数,进入调用的函数内部;否则,和 next 命令的功能一样,注意,自定义的函数才可以进去,库函数和第三方提供的函数不能进去。
(gdb) set var 没有缩写,用来设置变量的值,eg:set var num=20
(gdb) set args 没有缩写,用来传参
(gdb) until (u) location 当你厌倦了在一个循环体内单步跟踪时,单纯使用 until 命令,可以运行程序直到退出循环体。
until n 命令中,n 为某一行代码的行号,该命令会使程序运行至第 n 行代码处停止。
(gdb) print (p) 打印指定变量的值,其中 xxx 指的就是某一变量名。
(gdb) list (l) 显示源程序代码的内容,包括各行代码所在的行号。
(gdb) finish(fi) 结束当前正在执行的函数,并在跳出函数后暂停程序的执行。
(gdb) return(return) 结束当前调用函数并返回指定值,到上一层函数调用处停止程序执行。
(gdb) jump(j) 使程序从当前要执行的代码处,直接跳转到指定位置处继续执行后续的代码。
(gdb) quit (q) 终止调试。
set:
set的参数是以空格间隔的
如果要把两个参数合并为一个参数传递,使用双引号括起来
set args "arg1 arg2"
给main函数传递参数:
1,r arg1 arg2 ...
run命令如同运行程序:./file.out arg1 arg2
2,set args arg1 arg2
这样也可以给main函数设置参数,参数是arg1,arg2
如何调试头文件中的代码:
core
ulimit -a
ulimit -c unlimited
ulimit -c unlimited之后还不见core文件,因为core文件生成路径不在当前目录下或者文件名没有设置,输入以下命令运行:
sudo bash -c "echo core > /proc/sys/kernel/core_pattern "
proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
调试core文件
gdb 要运行的文件名 core文件
程序会直接告诉你哪一行出错

多进程调试
set follow-fork-mode [parent|child]
parent:gdb默认调试的是父进程,如果参数是parent则fork之后继续调试父进程,子进程不受影响,会继续运行。
child:如果想调试子进程,则修改参数为child,set follow-fork-mode child之后调试子进程,父进程不受影响,会继续运行。
设置调试模式及:
set detach-on-fork [on|off]
默认为on,就是进程各运行各的,不被被挂起。
如果是off,除了调试进程,其他进程会被挂起。
查看调试的进程:
info inferiors
查询正在调试的进程,gdb会为他们分配唯一的Num号,其中前面带'*'号的就是正在调试的进程
切换调试的进程:
inferior Num
注意,这里没有s
退出正在运行的进程:
GDB是GNU旗下的程序调试器,支持多种编程语言,如C、C++等。安装GDB在Ubuntu上只需`sudo apt install gdb`。调试时,通过`-g`选项编译程序,并使用`gdb [程序名]`或`gdb [程序名] -q`启动调试。基本调试命令包括设置断点、运行、继续、单步执行等。此外,GDB还能调试头文件代码、处理core文件,并支持多进程调试。设置`set follow-fork-mode`和`set detach-on-fork`可以控制调试父子进程的行为。

1055

被折叠的 条评论
为什么被折叠?



