iis 网站目录权限设置,杭州网站制作公司网站,重庆有多少网站,网站设计师工作室文章目录 3. Linux调试器-gdb使用3.1 背景3.2 下载安装3.3 使用gdb查询3.4 开始使用 3. Linux调试器-gdb使用
3.1 背景
程序的发布方式有两种#xff0c;debug模式和release模式
Linux gcc/g出来的二进制程序#xff0c;默认是release模式
要使用gdb调试#xff0c;必须… 文章目录 3. Linux调试器-gdb使用3.1 背景3.2 下载安装3.3 使用gdb查询3.4 开始使用 3. Linux调试器-gdb使用
3.1 背景
程序的发布方式有两种debug模式和release模式
Linux gcc/g出来的二进制程序默认是release模式
要使用gdb调试必须在源代码生成二进制程序的时候, 加上 -g 选项 3.2 下载安装
debug模式的代码可以被调试release模式的代码不可以被调试。
为什么一个可以被调试一个不可以被调试呢?
debug模式的代码形成可执行程序的时候会有调试信息而release模式的代码没有。
我们可以先进入root账户安装一下gdb。
sudo apt update # 更新软件源
sudo apt install gdb # 安装gdb然后验证
# 检查gdb版本
gdb --version3.3 使用gdb查询
对于一个文件我们不知道是debug还是release就可以使用gdb来查询
我们先写一个Makefile
mycode:mycode.cgcc -o $ $^
.PHONY:clean
clean:rm -f mycode然后写一个mycode.c的文件里面写一个hello linux
然后编译使用gdb (No debugging symbols found in mycode)意味着不是debug版本的。
退出gdb的话输入一个q回车就行了。
还有个命令readelf -S mycode可以读取
文件的二进制构成可以看到里面没有debug。 说明gcc编译默认是release编译的。
如果我们想要debug编译可以改一下代码 这里的-g是使用debug前面的mycode-debug是改个名字便于区分。
然后我们make一下 出现了这个信息。 3.4 开始使用 gdb binFile 退出 ctrl d 或 quit 调试命令 listl 行号显示binFile源代码接着上次的位置往下列每次列10行。 listl 函数名列出某个函数的源代码。 r或run运行程序。 n 或 next单条执行。 s或step进入函数调用 break(b) 行号在某一行设置断点 break 函数名在某个函数开头设置断点 info break 查看断点信息。 finish执行到当前函数返回然后挺下来等待命令 print§打印表达式的值通过表达式可以修改变量的值或者调用函数 p 变量打印变量值。 set var修改变量的值 continue(或c)从当前位置开始连续而非单步执行程序 run(或r)从开始连续而非单步执行程序 delete breakpoints删除所有断点 delete breakpoints n删除序号为n的断点 disable breakpoints禁用断点 enable breakpoints启用断点 info(或i) breakpoints参看当前设置了哪些断点 display 变量名跟踪查看一个变量每次停下来都显示它的值 undisplay取消对先前设置的那些变量的跟踪 until X行号跳至X行 breaktrace(或bt)查看各级函数调用及参数infoi) locals查看当前栈帧局部变量的值 quit退出gdb mycode.c
#include stdio.hint addToTop(int top)
{int res0;int i1;for(;itop;i){resi;}return res;
}int main(){printf(debug begin\n);int top100;int sumaddToTop(top);printf(sum:%d\n,sum);printf(debug end\n);return 0;
} 执行编译生成的mycode-debug文件 输入命令进入交互模式 要调试首先要看到代码我们可以输入list或者l 不过这边只输出了10行我们也可以使用list n来显示一下 也可以输完l 0后回车一次出现10行。 直接输入r因为没有断点就直接运行了。 我们一般可以打断点
b 行号 这边打完断点怎么查呢
可以使用info b来查询。 怎么删除断点呢?
断点的删除可以使用b 行号来删除要注意这里的行号是Num这里的断点的行号。
这里的Enb的值有y和ny就是启用断点n就是禁用断点。 如果我们想要看里面的i就可以使用p i如果我们想要看里面的i的地址就可以使用p i
每次都这么输入比较麻烦我们就可以使用display。
display 变量名跟踪查看一个变量每次停下来都显示它的值。
如果我们想让自己从一个断点到另一个断点就可以直接使用continue(或c)。
也可以禁用断点而不是删除断点disable breakpoints