当前课程知识点:互联网体系结构 > 第二周:Socket网络编程 > 编译、构建和调试 > Video
他是一个调试器
就是在开始调试之前的
必须用程序中的调试信息
编译有调试的程序
也就是说我们在可执行文件里面要加入一些调试信息
这样gdb才能够调试所使用的变量、代码行和函数
如果要编译呢
我们就可以加了编译选项
也就说是在当前目录是吧
如果是不在当前目录
还需要加上相对路径和绝对路径
我们在gdb的hello
我们当前目录就是hello
就在当前目录下面是吧
file hello
我们也是指当前的目录
下面如果他当前执行的当前目录
不在当前目录
我们用绝对路径和相对路径来指明他所在的位置
就是装入这个程序之后
装入这个经过-g选项编译出来的可执行程序
这时
那我们用run命令他也可以简写为r来启动程序
如果一切正常
程序将执行到结束
结束此时
gdb并将重新获得控制
但是如果有错误
就是会怎样呢
这种情况
他gdb会控制
并在中断程序
从而让你检查所有事物的状态
如果运气好的话可以找到问题
你就说
正常情况下
我们gdb运行的程序它会直接结束
或者是中间运行出错
这时gdb会控制
出错的位置的一些状态
我可以检查的一种状态
我们来看一下
来看一下怎么用啊
这样编译出来的呢
编译的文件会更大一点
因为它里面带了符号
-g会大些
因为它里面有个符号表的吧
有了编译调试的信息
这时候呢
我们可以用gdb
这时候呢
我们是把这个
装载进来
这时侯我们运行run
他会输出HelloWorld对吧
这直接输出出来
但是我们也可以file
我们要调试一个程序的话
我们需要给他设置
断点对吧
可以在程序代码中的某一特定行或者函数中设置断点
这样gdb会在遇到断点
是中断执行
比如说这种断点
一开始执行
就让他中断
对吧就让他中断break
就是某一行
代码的行号也可以指明
也可以指明在那一行的位置的时候
他的变量的状态对吧
某种变量状态下
它会中断对吧
也可以有一个条件
有一个条件就是我们不设定断点
condition这个就是
你设定
condition就是变量状态
我们可以试一下这些
我们为了这个程序
先用简单的吧
先用简单的
我们这时候呢
我们是gdb把这个程序加载进来
我们这时候可以设置一个break
就是断点,你发现他会在第五行
有一个main是吧
他是设置了一个断点
如果这时候我run的话
他会执行到就是这个main函数
这个位置
那我们正常是可以用
来让他单步执行,next的单步执行
就是当前这个函数里面的子函数
他也是做一步
因为也做一步,直接next
他就把print函数给结束了
对吧结束了
如果我再next
这个函数程序就退出了对吧
这程序就已经退出了
那我们
如果我重新让他执行
重新让他执行,这时候呢
他执行到main又停下来的吧
断点又停下了
我用step单步执行
我们发现他就会进入到这个printf函数的内部
恩你发现他这地方执行的是libc里面的东西了
但是libc那边我们也没有跟踪
没有跟踪进去
所以我们不是在调试libc
所以他也没有
没有这些具体的信息
直到printf返回对吧
返回
这样结束对吧
这地方我们还可以
info break
我们可以把我们当前设置的所有断点给列出来是吧
断点给列出
还有break行号
我们也可以设置一个
break我们设置到第六行
这是第六行
如果我这个地方重新执行
我们重新来下刚进入了libc里啊
因为next耽误进入了step libc里面
我们调试的还是hello啊
我们这break
我们可以直接用b 第六行,你会发现他设置到file第六行
如果我让这个程序的话
我看在第六行停了下来
第六行实际是printf
是吧
那如果我是
break第五行
第五行就是printf helloworld
这是设置断点
但是还有还有一些设置条件
还有就是变量跟踪了是吧
我看变量跟踪他这个info locals是当前的变量
就是观察变量的变化状态还可以设置
这就是在运行过程中
我们修改变量的值啊
让他能够正常尝试能够正常执行变量的跟踪
变量的设置backtrace
就回溯缩写
这时我们可以看它的函数的调用关系,好像就是堆栈的状态
你要是这么来理解的话
需要跟踪堆栈
需要跟踪堆栈的状态的话
这地方会稍微深一点
你需要对程序的执行过程有一个初步的了解
也就是函数调用堆栈有一个了解,这个呢
我在我们那个linux内核分析里面专门分析过这一个程序
他一个C代码是怎么样在CPU上执行的
它实际上就是借助于堆栈函数调用堆栈来做的
但我们调试的时候
那我们可以
就是利用bt来看他的就是简单来讲
我们就是可以来看他的函数调用的
这个层次对吧函数调用的关系
比如说在
当前顶层
我们的当前执行的是,对吧
在这个里面
那么他是呢
是在main函数中被调用的
如果我们继续
进入的话是吧
继续进入的话
我们再bt
发现了他有了三层调用关系
也就是说
我们这么一个函数对吧
他是在里面被调用了,他的函数的调用关系
对吧
在某一个上面的我们还可以
用frame命令看他当前的这个
他的就是函数的状态也可以看到
如果我要up
就是他的上一级
-课程内容简介
--Video
-网络协议基础
--Video
--Video
--Video
--Video
-上网浏览网页背后的网络通信过程
--Video
--Video
-实验环境安装配置
--Video
-网络相关命令
--Video
--Video
-本周作业
--外部链接
-编译、构建和调试
--Video
--Video
--Video
-Socket接口
--Video
--Video
-UDP范例代码
--Video
-TCP范例代码
--Video
-本周作业
--外部链接
-TCP协议概述
--Video
--Video
-Linux网络协议栈源代码简介
--Video
-Linux系统的编译、构建和调试
--Video
--Video
-TCP协议源代码分析
--Video
-本周作业
--外部链接
-IP协议基础
--Video
-路由表
--Video
-路由转发举例
--Video
-IP协议栈源代码解析
--Video
-路由协议简介
--Video
-网络层数据传输路径解析
--Video
-本周作业
--外部链接
-ARP协议基础
--Video
-ARP解析的过程
--Video
-ARP解析在网络传输过程中的作用
--Video
-ARP协议栈源代码解析
--Video
-本周作业
--外部链接
-以太网基础
--Video
--Video
-交换机的学习、转发和过滤数据库
--Video
-常见二层协议
--Video
-数据链路层在Linux网络协议栈中的一些关键代码分析
--Video
-本周作业
--外部链接
-DNS协议基础
--Video
-DNS域名的存储
--Video
-DNS域名解析过程分析
--Video
-本周作业
--外部链接
-互联网架构设计的最初动机与核心目标
--Video
-互联网架构设计的具体目标及背后重要权衡
--Video
--Video
--Video
-课程考核
--外部链接