宁波网站建设服务公司电话,服装网站模板免费下载,迁安市住房和城乡建设局网站,佛山做外贸网站的公司1.debug/release
gdb是一款Linux下的一款调试器#xff0c;在没有图形化界面下#xff0c;是一种不错的调试方案#xff08;虽然在一般的开发环境中很少会使用gdb#xff09;
不过要使用gdb#xff0c;就先要了解debug和release版本。
发布软件的时候有一种叫debug版本…1.debug/release
gdb是一款Linux下的一款调试器在没有图形化界面下是一种不错的调试方案虽然在一般的开发环境中很少会使用gdb
不过要使用gdb就先要了解debug和release版本。
发布软件的时候有一种叫debug版本另外一种叫release版本在debug中包含了调试信息所以一般生成的debug文件会比release大一些。而release版本文件对程序做了较大的优化因此文件会小一些。
而gcc/g默认生成的可执行程序是release版本。但是gdb只能调试debug版本的文件这个时候就需要给gcc/g添加-g选项来生成release版本的文件。
$ cat main.c
#include stdio.h
int add(int num1, int num2)
{int sum num1 num2;return sum;
}
int main()
{int num1 10;int num2 5;int sum add(num1, num2);printf(num1: %d\n, num1);printf(num2: %d\n, num2);printf(sum: %d\n, sum);return 0;
}$ gcc main.c a.out-release
$ gcc main.c -g a.out-debug
$ ls
a.out a.out-g main.c如果我们需要查看release文件中的调试信息可以使用命令readelf -S 文件名来读取可执行程序的数据段格式-S表示读取各个段在下面可以查看到debug信息而没有带-g选项生成的可执行程序则没有这一信息这些试着操作一下知道行。 补充再编译原理中Linux中形成的可执行程序格式不是立刻全部变成二进制的而是变成ELF格式内部含有各种数据段… 利用管道工具可以让我们更加清晰看到这一现象
$ readelf -S a.out-release | grep -i debug
$ readelf -S a.out-debug | grep -i debug[27] .debug_aranges PROGBITS 0000000000000000 00001061[28] .debug_info PROGBITS 0000000000000000 00001091[29] .debug_abbrev PROGBITS 0000000000000000 00001199[30] .debug_line PROGBITS 0000000000000000 00001224[31] .debug_str PROGBITS 0000000000000000 0000126c2.gdb的基本操作
2.1.打开退出命令 打开gdb调试界面gdb debug版的可执行程序 $ gdb a.out-debug
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type show copying
and show warranty for details.
This GDB was configured as x86_64-redhat-linux-gnu.
For bug reporting instructions, please see:
http://www.gnu.org/software/gdb/bugs/...
Reading symbols from /home/ljp/LimouCodeFile/CodeFile_2/MyFile_2023_9_25/a.out-debug...done.
(gdb) 退出gdb调试界面使用[ctrl d]或者quit同时清空断点信息
2.2.查看代码命令
l/list [行号]为查看调试的代码每次显示10行list 0可以重头开始看源代码文本l/list [函数名]列出某个函数的源代码上下文
2.3.断点操作命令
b/break [源文件名] 源代码行号设置断点可以在某个源文件因为有可能会有多个文件的特定行号或函数名处设置断点并且生成的断点编号一直是递增的watch设置观察点当指定变量的值发生改变时中断程序执行不过要在调试过程中才能设置delete 断点/观察点编号删除断点/观察点不是使用行号删除而是删除断点对应的编号删除所有断点就是delete breakpoints注意这里就不需要指定文件因为这里不是靠指定的行号而是断点编号来取消断点的disable 断点/观察点编号禁用断点/观察点不是使用行号删除而是断点对应的编号禁用所有断点就是disable breakpointsenable 断点编号/观察点启用断点/观察点不是使用行号删除而是断点对应的编号开启所有断点就是enable breakpointsinfo/i b查看当前设置的所有断点/观察点。其中查看断点是否被启用在使用命令info b里的Enb那一列观察点通常被标记为 hw watchpoint等字样而断点通常被标记为 breakpoint这里还可以查看一个断点被命中的次数 补充1当您退出gdb的时候所有的断点/观察点信息会被自动清除。 补充2断点的禁用和启用也叫作“使能断点”。 2.4.执行相关命令
r/run run 命令用于开始程序的执行。如果您在 gdb 中设置了断点或观察点在使用 run 命令后程序将会在第一个断点或观察点处暂停执行此时您可以进行调试操作例如单步执行、查看变量值等类似VS 2022中第一次按下[F5]快捷键开始调试c/continue在使用r启用调试后可以使用c来跳转下一个断点类似VS 2022中继续使用[F5]快捷键n/next逐过程执行程序但不进入函数内部相当于VS 2022中的[F10]快捷键s/step逐语句执行程序进入函数内部相当于VS 2022中的[F11]快捷键unitl 行号可以跳转到行号出的代码在使用for循环的时候很有用不建议使用这个命令从main()跳到其他函数这是一种局部性的跳转finish执行完当前函数并返回到调用者并且停下来这是一种全局性的跳转
2.5.程序状态命令
display 变量名每次停在断点处时自动显示指定变量的值并且会显示对应的编号标识undisplay 变量编号则取消显示对应编号的变量的值注意这里使用的是变变量编号print(变量)或p 变量打印变量的值info locals查看当前函数/栈帧的所有局部变量info args查看当前函数的参数bt/backtrace显示当前的函数调用堆栈。frame切换到指定的堆栈帧。up切换到上一个堆栈帧down切换到下一个堆栈帧x以十六进制格式查看内存内容
2.6.其他常用命令 h/help获取帮助信息 set var 变量名可以直接篡改修改某变量的值有的时候需要查验在同一份代码下不同变量数据的表现 show显示当前的设置参数 补充由于gdb有很多重复操作因此如果需要重复使用一个命令在gdb中输入第一次命令后往后只不断按需要回车即可重复使用该命令。 3.gdb的进阶操作
在设计多进程和线程代码中还有很多相关的gdb命令哪些也值得查询一下。