怎么看调试过程的程序编译
⑴ c语言中什么叫做单步调试,步骤是什么
单步调试是指程序开发中,为了找到程序的bug,通常采用的一种调试手段,一步一步跟踪程序执行的流程,根据变量的值,找到错误的原因。
解决这个问题的方法如下:
1、首先需要设置断点的那一行代码的最前面点击下,就会出现一个红色的圆球,代表设置断点成功,下图一共设置了4个断点。
⑵ 这个程序在DEV C++上可以运行并出现正确结果 但是提交到PTA就会报错!请赐教!
当 C 语言程序能够正常编译并运行,但可能结果可疑或不对时,即,当程序没有语法错误而可能有逻辑错误时,就需要考虑使用调试Debug功能来找出程序的 bug。
在调试过程中,可以让程序运行到设置好的断点处并暂停下来,然后通过观察相关的变量值是否正确,来判断程序的逻辑错误可能出现在哪里。
本文以 Dev-C++ 5.11 开发环境为例来说明 C 语言的调试方法。
准备工作
设置断点
开始调试
添加查看
继续或停止调试
菜单:工具/编译选项
Tools/Compiler Options
在“设定编译器配置”Compiler set to configure中选择“TDM-GCC 4.9.2 64-bit Debug”。
提示:
如果是 32 位的系统,请选择“TDM-GCC 4.9.2 32-bit Debug”。
在下方的“编译器”General选项卡中,勾选“编译时加入以下命令:”Add the following commands when calling the compiler:,并在其中输入“-g”。如上图所示。
确定退出后,可在软件界面右上角看到或选择用于调试的编译器。
断点breakpoint,指的是在调试过程中程序运行到此行代码前会临时停下,以便观察此时的某些变量值。
可通过点击代码左侧的行号来设置断点。
或在某行代码上右击,选择“切换断点”Toggle Breakpoint。
或者使用快捷键:F4。
同样的方法也可用于取消断点设置。
断点设置建议:
设置在 scanf 等输入语句的下一行,以观察数据是否被正确获得。
设置在循环语句的下一行,以观察循环控制变量在循环结束后的值,或者为了避免调试过程中在循环语句段反复点击“下一步”按钮。
设置在函数调用语句的下一行,以观察函数返回的结果值是否正确。
在开始调试前,一般要先编译。
菜单:运行/编译
Execute/Compile
快捷键:F9
确保没有语法错误之后,再开始调试。
菜单:运行/调试。
Execute/Debug
快捷键:F5
或者,点击工具栏上的“”按钮。
开始调试后,代码将按照常规顺序依次运行。执行到第一个断点时,才临时停止,红色行变成蓝色行,代表即将要执行的代码行。
此时,可将鼠标指针悬浮于某个变量之上,以查看此时该变量的值。
提示:
对于字符变量,会同时显示字符的 ASCII 码值。
或者,在变量上右击,选择“添加查看”Add watch,会自动将此变量添加到左侧的调试Debug面板中,以便后续跟踪查看。
提示:
在变量名上双击,可精准选中变量。
或者,点击左下方的“添加查看”Add watch按钮,手动添加要查看的变量。
可以使用相关按钮继续调试工作。
下一步Next line按钮
运行下一行代码。如果下一行代码是对函数的调用,不进入函数体。
快捷键:F7
类似于 Turbo C++ 中的“Step Over”。
跳过Continue按钮
直接运行到下一个断点处。
单步进入Into function按钮
运行下一行代码,如果下一行是对函数的调用,则进入函数体内逐行运行。
快捷键:F8
类似于 Turbo C++ 中的“Trace”。
跳过函数Skip function按钮
当在函数内部时点击此按钮,将直接运行到函数结束,并返回到函数调用处。
停止执行Stop Execution按钮
停止调试,清除所有添加好的查看watch。
快捷键:F6
说明:
下一条语句Next instruction按钮和进入语句Into instruction按钮,常结合CPU窗口查看并执行指令。一般的调试工作中可以不用。
⑶ 编译和调试的区别
编译和调试都是写程序的重要环节。它们两者有什么区别呢?下面,我跟大家分享一下编译和调试的区别。
1.编译和调试的区别
编译是编译器在你程序没有运行的时候帮你检查错误。
调试是你用调试器在程序运行以后,根据运行状况来检查错误。
这两者的不可逆的,首先得编译通过,你才能调试啊,编译正确后,会生成exe文件,IDE中启动程序,可以进行调试。
编译是把源代码变成二进制obj的过程(链接后成为可执行文件),当然会先帮你检查有无简单的语法问题,要不编译器人家不认识,你自己说的有无逻辑就和编译器无关了。
调试首先需要生成二进制代码,所以需要首先进行编译和链接,然后到断点后,调试器会帮你加int 3中断,就停住了。
编译关注语法错误,调试关注逻辑错误。也就是说编译关注的是syntax(语法)方面的问题,调式关注的是semantics(语义)方面的问题。
2.编译词法分析
词法分析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。执行词法分析的程序称为词法分析程序或扫描器。
源程序中的单词符号经扫描器分析,一般产生二元式:单词种别;单词自身的值。单词种别通常用整数编码,如果一个种别只含一个单词符号,那么对这个单词符号,种别编码就完全代表它自身的值了。若一个种别含有许多个单词符号,那么,对于它的每个单词符号,除了给出种别编码以外,还应给出自身的值。
词法分析器一般来说有两种方法构造:手工构造和自动生成。手工构造可使用状态图进行工作,自动生成使用确定的有限自动机来实现。
3.编译语法分析
编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。编译程序的语法规则可用上下文无关文法来刻画。
语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法的开始符号出发,向下推导,推出句子。而自下而上分析法采用的是移进归约法,基本思想是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。
4.代码优化
代码优化是指对程序进行多种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。所谓等价,是指不改变程序的运行结果。所谓有效,主要指目标代码运行时间较短,以及占用的存储空间较小。这种变换称为优化。
有两类优化:一类是对语法分析后的中间代码进行优化,它不依赖于具体的计算机;另一类是在生成目标代码时进行的,它在很大程度上依赖于具体的计算机。对于前一类优化,根据它所涉及的程序范围可分为局部优化、循环优化和全局优化三个不同的级别。
4.编译出错处理
如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误的发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动纠正错误,这些工作由错误处理程序完成。
需要注意的是,一般上编译器只做语法检查和最简单的语义检查,而不检查程序的逻辑。逻辑错误要通过调试。
我总结:
看完了上面的比较,你现在还能区别编译与调试吗?其实,只要记住这句话:“编译关注语法错误,调试关注逻辑错误,先有编译,后有调试”,就不会忘了两者的区别了。
⑷ 如何查看C程序编译后生成的汇编语言啊
VC++编译器,在按F10后,调试工具栏的最后一个,点选它后,会出现一个窗口,里面的就是程序的汇编语言。
⑸ C语言 怎么调试程序
一、在keil中调试c语言程序
1、打开我们的程序,点击菜单栏右侧的start/stopdebug..按钮,进入调试模式,如下图。
⑹ c++编译器怎样查看运行过程
你先写好你的程序,在工具栏的空白处右键,选择调试,就会出现一个调试工具,那上面的就是可以查看一步一步运行的过程路径,f11是快捷键。你慢慢研究,很好用的。给你张图!