大家好欢迎回来
在这个讲座中, 我想演示一下如何使用调试器｡
所以我想通过图形用户界面运行, 向您展示如何在调试模式下启动程序,
如何设置断点, 如何查看调用堆栈以及如何使用监视窗口查看不同的变量｡
只是一个简单的计算平均值的程序｡
我要用这个来做个示范｡
它所做的就是读入三个整数并存储它们, 然后计算它们的平均值｡
现在, 在我们实际使用调试器之前, 我想提一件事, 你必须确保你的配置设置正确｡
我在之前的视频中已经讨论过这个问题, 基本上是为使用调试器配置代码光｡
但只是为了刷新你的记忆, 你可以在这里选择项目, 你可以右键单击, 你去设置｡
您需要再次确保, 根据您所使用的平台, 您需要确保左侧的调试器设置具有正确的GDB路径｡
现在, 如果您在Windows上, 可能需要使用Cygwin的GDB X, 或者可能使用MinGW w64, 无论您使用什么｡
如果您使用的是Unix和Linux, 则甚至不需要设置此路径｡
另一件重要的事情是在编译器选项中, 你要确保你是为了调试而编译的,
这样Dash G dwarf就在dash o上进行优化｡
同样, 在Windows中, 必须设置这些内容, 以便在可执行文件中包含调试信息｡
您还必须确保正在为调试模式进行构建｡
因此, 您必须确保选择了debug而不是release｡
一旦您正确配置了所有这些东西, 您应该能够使用调试器和代码灯｡
如果你有任何问题, 请回到我的视频在你的平台上配置｡
调试器和代码灯｡
关于调试器最重要的概念是断点的概念｡
因此断点是您可以在程序中设置的东西, 它将停止代码的执行｡
你可以说, 我想停在这一行, 你的程序, 当你运行调试器时,
会停在这一行, 这允许你查看变量, 变量的值｡
它允许您一次单步执行一行代码, 以尝试诊断和修复可能出现的任何问题｡
通常, 当你运行你的程序时, 如果你试图在调试器中运行它, 而你没有设置断点,
什么都不会发生｡
所以通常当你构建时, 你知道, 你可以去构建你的项目, 就像任何其他项目一样,
去构建, 去构建项目｡
当你在调试模式下构建并运行它时, 你必须进入调试器菜单选项, 你必须进入开始,
继续调试器｡
当你再次执行它时, 如果你设置了断点, 它就会命中它｡
如果您没有设置断点, 它将直接运行｡
所以如果我们在调试模式下执行这个程序, 它会出现并要求输入, 因为它停在数字上,
然后你只需要输入一些数字, 它就关闭了｡
它甚至不会打印出信息, 对吧？
因此, 如果要使用调试器, 至少设置一个断点非常重要｡
设置断点的最简单方法是在要设置断点的行号旁边的页边空白处单击｡
同样, 断点将停止该行号上的执行｡
所以如果我们在第十行的printf函数旁边设置一个断点, 我们只要双击, 你会看到一个红色的圆圈｡
这是在告诉调试器, 嘿, 停在第十行｡
同样, 我们启动调试器的方式是, 我们进入调试器, 然后说, 开始, 继续, 对吗？
其他的都是灰色的, 对吧？
所以让我们启动调试器来命中那个断点｡
让我们开始继续调试器, 我们会说构建和调试, 你会注意到程序停在第十行｡
你看到绿色箭头了, 你还看到调试器面板出现了.
因此, 如果您转到view, 您实际上可以手动打开调试器窗格, 或者当您进入调试模式时,
它可以自动出现, 并且调试器窗格具有许多不同的选项卡, 可以查看信息｡
你也可以通过调试器, 进入GDB窗口, 你可以看到所有被选中的｡
您可以查看许多调试器窗口｡
所以局部变量通常与你的局部变量监视器有关｡
你可以在一个变量上放一个监视器, 这样如果变量改变了, 它就会弹出｡
输出用于不同的调试选项和输出线程｡
您可以查看正在运行程序的线程｡
更高级的概念Callstack是我们所关注的｡
我们主要看调用堆栈和局部变量｡
这两个是最重要的, 可以帮助您进行调试, 然后是内存, 然后是断点｡
您可以看到设置断点的位置｡
所以有很多不同的选择｡
我们现在停在十号线｡
我们可以查看调用堆栈｡
调用堆栈显示主函数被调用｡
如果我们看局部变量, 它显示了三个变量, 01和0｡
我们实际上没有输入任何信息, 在那些被初始化的0, 1和0中｡
手表是你实际上可以添加｡
通过点击加号来添加对特定变量的监视｡
另外一件要注意的重要事情是, 当你在调试模式下运行时, 你现在有了调试器的工具栏,
对吧？
播放按钮将继续｡
所以它会去｡
如果我按下播放键, 它就会退出程序, 对吧？
它将开始运行｡
程序实际上会要求输入｡
所以我按了播放键｡
我回到控制台应用程序, 它说输入｡
所以我在程序运行中击中了我的三个数字｡
那你还是没看到打印功能｡
窗户就这么不见了｡
所以, 我们在调试模式下运行, 它再次进入断点, 调试器窗格出现, 它停止了第十行｡
现在工具栏很重要, 因为这是你可以单步执行代码的方式, 你可以使用工具栏,
或者你可以去调试器, 你可以在这里查看所有的选项｡
所以你可以说step into, step into, next, next, step out, step into,
将进入函数内部｡
如果在该行调用了一个函数, 那么单步执行指令更多地涉及汇编语言类型的内容｡
接下来, 我们将跳过这行代码｡
和颈部训练是一回事｡
如果你已经在一个函数中, 尝试跳出这个函数, 跳到胡萝卜行｡
实际上我认为是光标｡
同样的道理, 也适用于跑到胡萝卜线上｡
你可以打开和关闭断点, 禁用它们, 所有这些东西, 这样你就可以通过菜单访问它｡
再次, 工具栏｡
通常我使用工具栏是因为它已经打开了｡
然后如果你再看一下不同的窗口, 局部变量调用堆栈和断点｡
真正重要的那些｡
这里说我在第十行有一个断点｡
然后我想一个人只说光标｡
现在我在第十行的printF输入处停了下来｡
我可以转到下一个指令, 这将转到第11行扫描｡
F实际上是一个请求输入的阻塞函数｡
所以如果我试着去下一个, 它实际上只是有点停顿｡
实际上, 你可能需要多次点击Next｡
当程序请求输入时, 我通常会做的, 它已经被阻塞了, 它已经停止了, 我想让它进入下一个｡
我将在下一行上放置一个断点, 然后按播放按钮｡
所以现在我按下播放按钮, 什么也没发生, 因为它在等待输入｡
在程序中, 它说输入｡
我可以按下五, 六, 七, 按下回车键, 现在它到了我的断点｡
所以现在我们在打印按钮处, 我们实际上可以跳转到打印功能｡
实际上, 它首先会跳到平均函数｡
所以如果我们说step into, 我们会看到我们进入平均函数｡
你会注意到的是, 如果你观察你的变量, 你可以看到你的变量在变化｡
所以如果你下一个, 你去下一行27, 然后28, 然后继续打击｡
接下来, 你实际上跳出了, 你实际上在函数的末尾｡
然后你可以点击播放, 你可以看到你的程序已经完成, 窗口消失了｡
但你可以看看你的变量, 你可以看看其他一切｡
同样, 你也可以在print函数中放置一个断点｡
如果我们运行到那个位置, 我们可以再次看到print函数将停止执行, 而不是平均值｡
然后我们可以看到实际发生了什么, 如果我们走过去, 进入应用程序,
你可以看到信息被打印出来｡
对吧？
当你继续的时候, 当你运行到最后的时候, 你得到了return语句, 程序就会退出｡
因此, 如果你确实想看到程序的输出, 那么在返回之前放置一个断点是很重要的,
你不必继续｡
您可以通过点击红色矩形停止调试器, 通过点击两个平行条暂停调试器,
使用该选项和调用堆栈重新启动调试器｡
同样, 在这里更容易看到, 如果你进入一个函数, 然后运行调试器, 我们将再次运行调试器｡
说调试器, 开始, 继续｡
当我们在函数内部输入信息后到达这个断点时, 你会看到车栈有main和print,
就像我们之前展示的一样｡
所以你可以看到最后一个函数, 现在被一个有很多函数的程序调用,
调用堆栈可以比这个大得多｡
唯一重要的是断点｡
如果你想看到你设置了什么样的断点, 它会显示所有的断点以及它们所在的整个程序｡
但是您必须熟悉它, 熟悉它, 并经常使用它来解决您无法使用基本调试技术或程序解决的问题｡
一行一行地崩溃｡
当你一行一行地读的时候, 你可以看到程序一旦崩溃就退出了, 你可以知道是在哪一行发生的｡
同样, 这是一个小程序, 但您应该对调试的工作原理有基本的了解｡
再次, 我希望这是有帮助的｡
学习这些东西的最好方法是开始玩它并开始使用它｡
提出你在上一个挑战中参与的一个程序｡
添加一个断点, 非常简单｡
只需点击右内的东西添加断点｡
在调试模式下启动它, 并逐行查看变量如何更改以及调用堆栈如何增加｡
如果你有更大的功能｡
谢谢大家｡