在Linux下使用gdb调试代码 - Go语言中文社区

在Linux下使用gdb调试代码


一个不会调试的程序员不是一个好的程序员。
gdb即GNU debugger,是一个在Linux下调试程序的有力工具。gdb完成的大部分工作都可以用很少的命令集合完成。
下面说一下在Linux下使用gdb调试代码的有关技巧。

为了方便说明问题,这里使用了一个简单的带有bug的代码helloworld.c:

#include <stdio.h>

int main()
{
	int *buf = NULL;
	*buf = 5;
	printf("helloworld\n");
	
	return 0;
}
  1. 编译生成可执行程序
    先使用gcc将上面的helloworld.c编译生成可执行程序hello,注意编译时gcc编译选项-g,这样生成的目标代码中就添加了调试信息:
 gcc -g –o hello helloworld.c
  1. 启动gdb
    启动gdb的命令是:gdb 程序名 [corefile]
    corefile文件是可选的,但加上corefile文件能增强gdb的调试能力。
    注意了:Linux默认是不生成corefile的,可以通过一下的方法生成corefile:
    a.打开Linux一个终端,cd不带参数切换到宿主目录;
    b.打开.bashrc文件:vi .bashrc,并在.bashrc文件最后添加:
    ulimit -c unlimited
    c.修改完.bashrc文件后记得. .bashrc让修改生效。
    所以这里启动gdb的命令是:
gdb hello

终端显示了:
在这里插入图片描述
可以看到显示了很多关于gdb版本、介绍的信息,如果不想看到这些信息,可以在启动gdb的时候加上-q,就不会显示这些信息了:

gdb -q hello
  1. gdb的run命令:
    启动gdb后,在调试环境下使用run命令运行要调试的程序:
    在这里插入图片描述
    可以看到,gdb不但能显示出错行号,还能说明出错出现时的内存地址,这个也是潜在的有用信息。
  2. gdb的where命令
    where命令,显示导致段错误的执行函数树:
    在这里插入图片描述
#0  0x000000000040054b in test () at helloworld.c:7
#1  0x0000000000400561 in main () at helloworld.c:12

问题出现在helloworld.c的第7行。
知道第7行代码出现问题,这时可是使用list [m,n]命令查看出问题的上下相关代码,m,n是要显示包含错误首次出现位置的起始行和结尾行。不带参数的list将显示附近的10行代码。
在这里插入图片描述
5. 调试过程中打印变量的值
gdb最有用的功能之一就是它可以显示被调试程序中任何表达式、变量的值。命令格式为:

print 变量,表达式。
print ‘file’::变量,表达式,‘’是必须的,以便让gdb知道指的是一个文件名。
print funcname::变量,表达式

在这里插入图片描述
显示指针变量buf的值为0。
whatis 命令可以告诉你变量的类型, ptype 告诉你结构的定义。
在这里插入图片描述
6. 断点和逐步调试
使用gdb调试时,可以添加断点来调试,添加断点的命令有:

break linenum
break funcname
break filename:linenum
break filename:funcname

在这里插入图片描述
断点设置好了,然后重新run程序,然后就在设置断点的代码行停下,等待输入新的命令。

–>单步调试
step命令
当遇到一个函数的时候,step将进入函数,每次执行一条语句,相当于step into
–>next命令
当遇到一个函数的时候,next将执行整个函数,相当于step over
–>return [value]命令
停止执行当前函数,将value返回给调用者,相当于step return
–>continue命令从断点以后继续执行。
–>delete删除一个断点
–>改变一个变量的值。
set variable varname = value
varname是变量名称,value是变量的新值

如果需要重复执行一条命令,不需要每次都键入命令,gdb记住了最后一个被执行的命令,只要简单的按enter键就可以重复执行最后的命令

总结
gdb调试工具功能还是比较齐全的,也是比较重要的,要多点练习才能熟能生巧。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/akkk1kkka/article/details/106175895
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2023-01-03 20:17:49
  • 阅读 ( 266 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢