GDB调试

GDB是GNU旗下的程序调试器,支持多种编程语言,如C、C++等。安装GDB在Ubuntu上只需`sudo apt install gdb`。调试时,通过`-g`选项编译程序,并使用`gdb [程序名]`或`gdb [程序名] -q`启动调试。基本调试命令包括设置断点、运行、继续、单步执行等。此外,GDB还能调试头文件代码、处理core文件,并支持多进程调试。设置`set follow-fork-mode`和`set detach-on-fork`可以控制调试父子进程的行为。

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

退出正在运行的进程:


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿饵块

有帮助就给点辛苦费吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值