作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)

gdb(GNU Debugger) 是一个用于调试 Linux 系统的软件工具。在学习 Linux 的过程中,gdb 的重要性不言而喻。以下是 gdb 在 Linux 学习者中的重要性的详细说明:

  1. 帮助理解 Linux 系统的运作方式:gdb 是一个强大的调试工具,可以帮助学习者深入了解 Linux 系统的运作方式。通过使用 gdb,学习者可以调试 Linux 内核、系统调用、文件系统等等。
  2. 提高编程技能:gdb 不仅仅是一个调试工具,还是一个开发工具。学习者可以使用 gdb 调试自己的程序,从而提高编程技能。调试程序需要对计算机系统的工作原理有深入的理解,而 gdb 可以帮助学习者做到这一点。
  3. 帮助解决故障:在使用 Linux 系统时,难免会遇到故障。gdb 可以帮助学习者快速定位和解决故障。学习者可以使用 gdb 调试系统命令、文件系统、网络连接等等,从而解决故障。
  4. 提高实践能力:gdb 是一个实践性很强的工具。学习者可以通过使用 gdb 进行调试,提高自己的实践能力。在实际应用中,掌握 gdb 是非常有用的。

安装gdb

	sudo yum install -y gdb

进入gdb调试:
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第1张图片
  默认情况下,gdb无法进行对现在发布程序进行调试
  在Linux中,用g++/gcc生成可执行程序时,默认是release版本的,而release版本是发布版本无法进行调试,我们需要先将其更改为debug版本。
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第2张图片

gcc:默认行为:

  • 默认是动态链接
    在这里插入图片描述
  • 默认是release

  debug与release版本区别:debug是提供给程序员的,程序员需要经常去写代码还需要通过调试去验证代码的正确性。release版本是提供给用户的,用户不需要写代码也不需要调试,所以能够优化掉一部分功能,减少占用的内存。


调试准备

  要用gbd调试,我们首先需要将可执行程序更改为debug版本,给编译器添加-g标识:

	gcc -o mytest_g Test.c -g

作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第3张图片

作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第4张图片
  我们能很清楚的发现,debug版本的可执行程序要比release版本的可执行程序占用空间更大
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第5张图片
  这样我们就可以调试起来了。
  我们还可以通过下面方式判断是否是debug版本:

	readelf -S mytest_g | grep debug

作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第6张图片
  debug版本是带有调试信息的


正式调试

显示代码:
list/l 行号:显示源代码,回车直接接着上次的位置往下列,每次列10行
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第7张图片
打断点:
break / b + 行号:在某一行设置断点
info break / b :查看所有断点
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第8张图片
删除断点:
d + breakpoint的编号(不是打断点的行号)
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第9张图片
删除所有断点:d breakpoint
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第10张图片

开始调试:
run / r (开始调试,在断点处停下来,相当于vs的F5)
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第11张图片
逐过程:
next / n(相当于vs的F10)
在这里插入图片描述
逐语句:
step / s (相当于vs的F11)
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第12张图片
逐断点:
continue / c (运行至下一个断点)
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第13张图片
查看调用堆栈:breaktrace / bt
直接运行完当前所处的函数,并在函数返回后停下来:finish
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第14张图片
打印变量值:p + 变量名
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第15张图片
常显示变量:display + 变量名(每次停下来都会打印它的值)
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第16张图片
取消常显示变量:undisplay + 编号(每个常显示之前)
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第17张图片
跳转到指定行:until + 行号(比如我们在一个循环中,我们需要跳出循环就可以使用until 这个跳转的行号未必一定是我们until后面跟的行号,编译器会自己优化一下)
作为C/C++程序员你可以不使用但你必须会的Linux调试器-gdb(GNU Debugger)_第18张图片

其它调试指令:
list/l 函数名:列出某个函数的源代码。
break 函数名:在某个函数开头设置断点
print / p:在 GDB 调试程序的过程中,输出或者修改指定变量或者表达式的值
set var:修改变量的值
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(i) locals:查看当前栈帧局部变量的值


如有错误或者不清楚的地方欢迎私信或者评论指出

你可能感兴趣的:(Linux基础,linux,c语言,c++,面试)