当前位置:文档之家› Keil 的调试命令、在线汇编与断点设置

Keil 的调试命令、在线汇编与断点设置

Keil 的调试命令、在线汇编与断点设置
Keil 的调试命令、在线汇编与断点设置

Keil 的调试命令、在线汇编与断点设置

上一讲中我们学习了如何建立工程、汇编、连接工程,并获得目标代码,但是做到这一步仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部份的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发中重要的一个环节,这一讲将介绍常用的调试命令、利用在线汇编、各种设置断点进行程序调试的方法,并通过实例介绍这些方法的使用。

一、常用调试命令

在对工程成功地进行汇编、连接以后,按Ctrl+F5 或者使用菜单Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功能强大,可以在没有硬件和仿真机的情况下进行程序的调试,下面将要学的就是该模拟调试功能。不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。

进入调试状态后,界面与编缉状态相比有明显的变化,Debug 菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图 1 所示,Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令。

? 图1 调试工具条

学习程序调试,必须明确两个重要的概念,即单步执行与全速运行。全速执行是指一行程序执行完以后紧

接着执行下一行程序,中间不停止,这样程序执行的速度很快,并可以看到该段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难以确认错误出现在哪些程序行。单步执行是每次执行一行程序,执行完该行程序以后即停止,等待命令执行下一行程序,此时可以观察该行程序执行完以后得到的结果,是否与我们写该行程序所想要得到的结果相同,借此可以找到程序中问题所在。程序调试中,这两种运行方式都要用到。

使用菜单STEP 或相应的命令按钮或使用快捷键F11 可以单步执行程序,使用菜单STE P OVER 或功能键F10 可以以过程单步形式执行命令,所谓过程单步,是指将汇编语言中的子程序或高级语言中的函数作为一个语句来全速执行。

图2 调试窗口

按下F11 键,可以看到源程序窗口的左边出现了一个黄色调试箭头,指向源程序的第一行,如图2 所示。每按一次F11,即执行该箭头所指程序行,然后箭头指向下一行,当箭头

指向LCALL DELAY 行时,再次按下F11,会发现,箭头指向了延时子程序DELAY

的第一行。不断按F11 键,即可逐步执行延时子程序。

通过单步执行程序,可以找出一些问题的所在,但是仅依靠单步执行来查错有时是困难的,或虽能查出错误但效率很低,为此必须辅之以其它的方法,如本例中的延时程序是通过

将D2:DJNZ R6,D2 这一行程序执行六万多次来达到延时的目的,如果用按F11 六万多

次的方法来执行完该程序行,显然不合适,为此,可以采取以下一些方法,第一,用鼠标在子程序的最后一行(ret)点一下,把光标定位于该行,然后用菜单Debug->Run to Curs or line

(执行到光标所在行),即可全速执行完黄色箭头与光标之间的程序行。第二,在进入该子

程序后,使用菜单Debug->Step Out of Current Function(单步执行到该函数外),使用该命令后,即全速执行完调试光标所在的子程序或子函数并指向主程序中的下一行程序(这里是JMP LOOP 行)。第三种方法,在开始调试的,按F10 而非F11,程序也将单步执行,不同的是,执行到lcall delay 行时,按下F10 键,调试光标不进入子程序的内部,而是全速执行完该子程序,然后直接指向下一行“JMP LOOP”。灵活应用这几种方法,可以大大提高查错的效率。

二、在线汇编

?

在进入Keil 的调试环境以后,如果发现程序有错,可以直接对源程序进行修改,但是要使修改后的代码起作用,必须先退出调试环境,重新进行编译、连接后再次进入调试,如果只是需要对某些程序行进行测试,或仅需对源程序进行临时的修改,这样的过程未免有些麻烦,为此Keil 软件提供了在线汇编的能力,将光标定位于需要修改的程序行上,用菜单Debug->Inline Assambly… 即可出现如

图3 的对话框,在Enter New 后面的编缉框内直接输入需更改的程序语

句,输入完后键入回车将自动指向下一条语句,可以继续修改,如果不再需要修改,可以点击右上角的关闭按钮关闭窗口。

三、断点设置

图3 在线汇编窗口

程序调试时,一些程序行必须满足一定的条件才能被执行到(如程序中某变量达到一定

的值、按键被按下、串口接收到数据、有中断产生等),这些条件往往是异步发生或难以预先设定的,这类问题使用单步执行的方法是很难调试的,这时就要使用到程序调试中的另一种非常重要的方法——断点设置。断点设置的方法有多种,常用的是在某一程序行设置断点,设置好断点后可以全速运行程序,一旦执行到该程序行即停止,可在此观察有关变量值,以确定问题所在。在程序行设置/移除断点的方法是将光标定位于需要设置断点的程序行,使用菜单Debug->Insert/Remove BreakPoint 设置或移除断点(也可以用鼠标在该行双击实现同样的功能);Debug->Enable/D isable Breakpoint 是开启或暂停光标所在行的断点功能;Debug->Disable All Breakpoint 暂停所有断点;Debug->Kill All BreakPoint 清除所有的断点设置。这些功能也可以用工具条上的快捷按钮进行设置。

除了在某程序行设置断点这一基本方法以外,Keil 软件还提供了多种设置断点的方法,

按Debug->Breakpoints… 即出现一个对话框,该对话框用于对断点进行详细的设置,如图4

所示。

图4 中Expression 后的编缉框内用于输入表达式,该表达式用于确定程序停止运行的条件,这里表达式的定义功能非常强大,涉及到Keil 内置的一套调试语法,这里不作详细说明,仅举若干实例,希望读者可以举一反三。

1)在Experssion 中键入a==0xf7,再点击Define 即定义了一个断点,注意,a 后有两个等号,意即相等。该表达式的含义是:如果a 的值到达0xf7 则停止程序运行。除

使用相等符号之外,还可以使用>,>=,<,<=,!=(不等于),&(两值按位与),&&(两

值相与)等运算符号。

2)在Experssion 后中键入Delay 再点击Define,其含义是如果执行标号为Delay 的行则中断。

?

3)在Experssion 后中键入Delay,按Count 后的微调按钮,将值调到3,其意义是当第三次执行到Delay 时才停止程序运行。

4)在 Experssion 后键入 Delay ,在

Command 后键入printf(“SubRoutine

…Delay?has been Called\n”)主程序每次调用Delay 程序时并不停止运行,但会在输出窗口Command 页输出一行字符,即SubRoutine …Delay? has been Called。其中“\n”的用途是回车换行,使窗口输出的字符整齐。

5)设置断点前先在输出窗口的Command

页中键入DEFINE int I,然后在断点设

图4 断点设置对话框

置时同4),但是Command 后键入printf(“SubRoutine …Delay? has been Called %d ti mes\n”,++I),则主程序每次调用Delay 时将会在Command 窗口输出该字符及被调用的次数,如SubRoutine …Delay?has been Called 10 times。

对于使用C 源程序语言的调试,表达式中可以直接使用变量名,但必须要注意,设置

时只能使用全局变量名和调试箭头所指模块中的局部变量名。

四、实例调试

为进行程序的调试,我们首先给源程序制造一个错误,将延时子程序的第三行“DJNZ R6,$”后的$改为D1,然后重新编译,由于程序中并无语法错误,所以编译时不会有任何出错提示,但由于转移目的地出错,所以子程序将陷入无限循环中。

进入调试状态后,按F10 以过程单步的形式执行程序,当执行到LCALL DELAY 行时,

程序不能继续往下执行,同时发现调试工具条上的Halt 按钮变成了红色,说明程序在此不断地执行着,而我们预期这一行程序执行完后将停止,这个结果与预期不同,可以看出所调用的子程序出了差错。为查明出错原因,按Halt 按钮使程序停止执行,然后按RST 按钮使程序复位,再次按下F10 单步执行,但在执行到LCALL DELAY 行时,改按F 11 键跟踪到

子程序内部(如果按下F11 键没有反应,请在源程序窗口中用鼠标点一下),单步执行程序,

可以发现在执行到“DJNZ R6,D1”行时,程序不断地从这一行转移到上一行,同时观察左侧的寄存器的值,会发现R6 的值始终在FFH 和FEH 之间变化,不会减小,而我们的预期是R6 的值不断减小,减到0 后往下执行,因此这个结果与预期不符,通过这样的观

察,不难发现问题是因为标号写错而产生的,发现问题即可以修改,为了验证即将进行的修改是

否正确,可以先使用在线汇编功能测试一下。把光标定位于程序行

“DJNZ R6,D1”,打开

在线汇编的对话框,将程序改为“DJNZ R7,0EH”,即转回本条指令所在行继续执行,其中

0EH 是本条指令在程序存储器中的位置,这个值可以通过在线汇编窗口看到,如图3 所示。然后关闭窗口,再进行调试,发现程序能够正确地执行了,这说明修改是正确的。注意,这时候的源程序并没有修改,此时应该退出调试程序,将源程序更改过来,并重新编译连接,

以获得正确的目标代码。

Keil教程(3)

Keil 程序调试窗口

上一讲中我们学习了几种常用的程序调试方法,这一讲中将介绍Keil 提供各种窗口如输出窗口、观察窗口、存储器窗口、反汇编窗口、串行窗口等的用途,以及这些窗口的使用方法,并通过实例介绍这些窗口在调试中的使用。

一、程序调试时的常用窗口

Keil 软件在调试程序时提供了多个窗口,主要包括输出窗口(Output Windows)、观察

窗口(Watch&Call Statck Windows)、存储器窗口(Memory Window)、反汇编窗口(Di ssambly Window)串行窗口(Serial Window)等。进入调试模式后,可以通过菜单View 下的相应命令打开或关闭这些窗口。

图1 是输出窗口、观察窗口和存储器窗口,各窗口的大小可以使用鼠标调整。进入调试

程序后,输出窗口自动切换到Command 页。该页用于输入调试命令和输出调试信息。对于初学者,可以暂不学习调试命令的使用方法。

图1 调试窗口(命令窗口、存储器窗口、观察窗口)

1、存储器窗口

?

存储器窗口中可以显示系统中各种内存中的值,通过在Address 后的编缉框内输入“字母:数字”即可显示相应内存值,其中字母可以是C、D、I、X,分别代表代码存储空间、直接寻址的片内存储空间、间接寻址的片内存储空间、扩展的外部RAM 空间,数字代表想要查看的地址。例如输入D:0 即可观察到地址0 开始的片内RAM 单元值、键入C:0

即可显示从0 开始的ROM 单元中的值,即查看程序的二进制代码。该窗口的显示值可以以各种形式显示,如十进制、十六进制、字符型等,改变显示方式的方法是点鼠标右键,在弹出的快捷菜单中选择,该菜单用分隔条分成三部份,其中第一部份与第二部份的三个选项为同一级别,选中第一部份的任一选项,内容将以整数形式显示,而选中第二部份

的 Ascii 项则将以字符型式显示,选中Float 项将相邻四字节组成的浮点数形式显示、选中Double 项则将相邻8 字节组成双精度形式显示。第一部份又有多个选择项,其中Decimal 项是一个开关,如果选中该项,则窗口中的值将以十进制的形式显示,否则按默认的十六进制

方式显示。Unsigned 和Signed 后分别有

图 2 存储器数值各种方式显示选择

三个选项:Char、Int、Long,分别代表以单字节方式显示、将相邻双字节组成整型数方式

显示、将相邻四字节组成长整型方式显示,而Unsigned 和Signed 则分别代表无符号形式和

有符号形式,究竟从哪一个单元开始的相邻单元则与你的设置有关,以整型为例,如果你输入的是I:0,那么00H 和01H 单元的内容将会组成一个整型数,而如果你输入的是I:1,01H和02H 单元的内容全组成一个整型数,以此类推。有关数据格式与C 语言规定相同,请参

考 C 语言书籍,默认以无符号单字节方式显示。第三部份的Modify Memory at X:xx 用于更改鼠标处的内存单元值,选中该项即出现如图3 所示的对话框,可以在对话框内输入要修改的内容。

2、工程窗口寄存器页

图3 存储器的值的修改

图4 是工程窗口寄存器页的内容,寄存器页包括了当前的工作寄存器组和系统寄存器,

系统寄存器组有一些是实际存在的寄存器如A、B、DPTR、SP、PSW 等,有一些是实际中并不存在或虽然存在却不能对其操作的如 PC、Status 等。每当程序中执行到对某寄存器的操作时,该寄存器会以反色(蓝底白字)显示,用鼠标单击然后按下F2 键,即可修改该值。

3、观察窗口

?

观察窗口是很重要的一个窗口,工程窗口中仅可以观察到工作寄存器和有限的寄存器如A、B、DPTR 等,如果需要观察其它的寄存器的值或者在高级语言编程时需要直接观察变量,就要借助于观察窗口了。

其它窗口将在以下的实例中介绍。一般情况下,我们仅在单步执行时才对变量的值的变化感兴趣,全速运行时,变量的值是不变的,只有在程序停下来之后,才会将这些值最新的变化反映出来,但是,在一些特殊场合下我们也可能需要在全速运行时观察变量的变化,此时可以点击View->Periodic Window Updata(周期更新窗口),确认该项处于被选中状态,即可在全速运行时动态地观察有关值的变化。但是,选中该项,将会使程序模拟执行的速度变慢。

二、各种窗口在程序调试中的用途

以下通过一个高级语言程序来说明这些窗口的使用。例2:

图4 工程窗口寄存器页

#include "reg51.h"

sbit P1_0=P1^0; //定义P1.0

void mDelay(unsigned char DelayTime)

{ unsigned int j=0;

for(;DelayTime>0;DelayTime--)

{ for(j=0;j<125;j++) {;} }

}

void main()

{ unsigned int i;

for(;;){ mDelay(10); // 延时 10

毫秒

i++;

if(i==10)

{ P1_0=!P1_0;

i=0; }

} }

这个程序的工作过程是:不断调用延时程序,每次延时10 毫秒,然后将变量I 加1,随后对变量I 进行判断,如果I 的值等于10,那么将P1.0 取反,并将I 清0,最终的执行效果

是P1.0 每0.1S 取反一次。

输入源程序并以exam2.c 为文件名存盘,建立名为exam2 的项目,将exam2.c 加入项目,编译、连接后按Ctrl+F5 进入调试,按F10 单步执行。注意观察窗口,其中有一个标签页为Locals,这一页会自动显示当前模块中的变量名及变量值。可以看到窗口中有名为I 的变量,其值随着执行的次数而逐渐加大,如果在执行到mDelay(10)行时按F11 跟踪到mDelay 函数内部,该窗口的变量自动变为DelayTime 和j。另外两个标签页Watch #1 和Watch #2 可以加入自定义的观察变量,点击“type F2 to edit”然后再按F2 即可输入变量,试着在Watch #1 中输入I,观察它的变化。在程序较复杂,变量很多的场合,这两个自定义观察窗口可以筛选出我们自己感兴趣的变量加以观察。观察窗口中变量的值不仅可以观察,还可以修改,以该程序为例,I 须加10 次才能到10,为快速验证是否可以正确执行到P1_0=!P1_0 行,点击

I 后面的值,再按F2,该值即可修改,将I 的值改到9,再次按F10 单步执行,即可以很快执行到P1_0=!P1_0 程序行。该窗口显示的变量值可以以十进制或十六进制形式显示,方法是在显示窗口点右键,在快捷菜单中选择如图5 所示。

?

点击 View->Dissambly Window 可以打开反汇编窗口,该窗口可以显示反汇编后的代码、源程序和相应反汇编代码的混合代码,可以在该窗口进行在线

汇编、利用该窗口跟踪已找行的代码、在该窗口按汇编代码的方式单步执行,这也是一个重要的窗口。打开反汇编窗口,点击鼠标右键,出现快捷菜单,如图 6 所示,其中Mixe d Mode 是以混合方式显示,Assembly Mode 是以反汇编码方式显示。

程序调试中常使用设置断点然后全速运行的方式,在断点处可以获得各变量值,但却无法知道程序到达断点以前究竟执行了哪些代码,而这往往是需要了解的,为此,Keil 提供了跟踪功能,在运行程序之前打开调试工具条上的允许跟踪代码开关,然后全速运行程序,当程序停止运行后,点击查看跟踪代码按钮,自动切换到反汇编窗口,

图5 设定观察窗的显示方式

图6 反汇编窗口

如图 6 所示,其中前面标有“-”号的行就是中断以前执行的代码,可以按窗口边的上卷按钮向上翻查看代码执行记录。

利用工程窗口可以观察程序执行的时间,下面我们观察一下该例中延时程序的延时时间是否满足我们的要求,即是否确实延时10 毫秒,展开工程窗口Regs 页中的Sys 目录树,其中的Sec 项记录了从程序开始执行到当前程序流逝的秒数。点击RST 按钮以复位程序,Sec 的值回零,按下F10 键,程序窗口中的黄色箭头指向mDelay(10)行,此时,记录下Sec 值为

0.00038900,然后再按F10 执行完该段程序,再次查看Sec 的值为0.01051200,两者相减大约是0.01 秒,所以延时时间大致是正确的。读者可以试着将延时程序中的unsigned in t 改为unsigned char 试试看时间是否仍正确。注意,使用这一功能的前提是在项目设置中正确设置晶振的数值。

Keil 提供了串行窗口,我们可以直接在串行窗口中键入字符,该字符虽不会被显示出来,但却能传递到仿真CPU 中,如果仿真CPU 通过串行口发送字符,那么这些字符会在串行

窗口显示出来,用该窗口可以在没有硬件的情况下用键盘模拟串口通讯。下面通过一个例子说

明Keil 串行窗口的应用。该程序实现一个行编缉功能,每键入一个字母,会立即回显到窗

口中。编程的方法是通过检测RI 是否等于 1 来判断串行口是否有字符输入,如果有字符输

入,则将其送到SBUF,这个字符就会在串行窗口中显示出来。其中ser_init 是串行口初始化程序,要使用串行口,必须首先对串行口进行初始化。例3:

MOV SP,#5FH ;堆栈初始化

CALL SER_INIT ;串行口初始化

LOOP:

JBC RI,NEXT ; 如果串口接收到字符,转

JMP LOOP ;否则等待接收字符

NEXT:

MOV A,SBUF ;从SBUF 中取字符

MOV SBUF,A ;回送到发送SBUF 中

SEND:

JBC TI,LOOP ;发送完成,转LOOP

JMP SEND ;否则等待发送完

SER_INIT: ;中断初始化

MOV SCON,#50H ORL TMOD,#20H ORL PCON,#80H

MOV TH1,#0FDH ;设定波特率

SETB TR1 ;定时器1 开始运行

SETB REN ;允许接收

SETB SM2

RET END

输入源程序,并建立项目,正确编译、连接,进入调试后,全速运行,点击串行窗口 1 按钮,即在原源程序窗口位置出现一个空白窗口,击键,相应的字母就会出现在该窗口中。在窗口中击鼠标右键,出现一个弹出式菜单,选择“Ascii Mode”即以Ascii 码的方式显示接收到的数据;选择“Hex Mode”以十六进制码方式显示接收到的数据;选择“Clear Windo w” 可以清除窗口中显示的内容。

由于部份CPU 具有双串口,故Keil 提供了两个串行窗口,我们选用的89C51 芯片只有一个串行口,所以Serial 2 串行窗口不起作用。

小技巧:凡是鼠标单击然后按F2 的地方都可以用鼠标连续单击两次(注意:不是双击)来替代。

Keil教程(4)

Keil 的辅助工具和部份高级技巧

在前面的几讲中我们介绍了工程的建立方法,常用的调试方法,除此之外,Keil 还提供了一些辅助工具如外围接口、性能分析、变量来源分析、代码作用分析等,帮助我们了解程的性能、查找程序中的隐藏错误,快速查看程序变量名信息等,这一讲中将对这些功工具作一介绍,另外还将介绍Keil 的部份高级调试技巧。

一、辅助工具

这部份功能并不是直接用来进行程序调试的,但可以帮助我们进行程序的调试、程序性能的分析,同样是一些很有用的工具。

1、外围接口

为了能够比较直观地了解单片机中定时器、中断、

并行端口、串行端口等常用外设的使用情况,Keil 提供了一些外围接口对话框,通过Pe ripherals 菜单选择,该菜单的下拉菜单内容与你建立项目时所选的 CPU 有关,如果是选择的89C51 这一类“标准”的51 机,那么将会有Interrupt(中断)、I/O Ports(并行I/ O 口)、Serial(串行口)、Timer(定时/计数器)这四个外围设

图1 外围设备之并行端口

备菜单。打开这些对话框,列出了外围设备的当前使用情况,各标志位的情况等,可以在这些对话框中直观地观察和更改各外围设备的运行情况。

下面我们通过一个简单例子看一看并行端口的外围设备对话框的使用。例4:

MOV A,#0FEH

LOOP: MOV P1,A

RL A

CALL DELAY ;延时100 毫秒

JMP LOOP

其中延时100 毫秒的子程序请自行编写。

编译、连接进入调试后,点击Peripherals->I/O-Ports->Port 1 打开,如图1 所示,全速运行,可以看到代表各位的勾在不断变化(如果看不到变化,请点击View->Periodic Window Updata),这样可以形象地看出程序执行的结果。

注:如果你看到的变化极快,甚至看不太清楚,那么说明你的计算机性能好,模拟执行的速度快,你可以试着将加长延时程序的时间以放慢速度。模拟运行速度与实际运行的速度无法相同是软件模拟的一个固有弱点。

点击Peripherals->I/O-Ports->Timer0 即出现图2 所示定时/计数器0 的外围接口界面,可以直接选择Mode 组中的下拉列表以确定定时/计数工作方式,0-3 四种工作方式,

图2 外围设备之定时器

keil软件调试单片机程序

先说一个概念:调试,在企业程序设计里(我把企业商务类型的软件开发叫企业程序设计,把单片机与驱动程序这样接触底层汇编与硬件相关的程序设计叫底层程序设计),调试一般都用来跟踪变量的赋值过程,以及查看内存堆栈的内容,查看这些内容的目的在于观察变量的赋值过程与赋值情况从而达到调试的目的。由于企业程序的宿主就是开发它的计算机本身,因此企业程序设计比起底层程序设计,特别是单片机的程序设计调试来的更直观,调试也更方便。 单片机的程序设计调试分为两种,一种是使用软件模拟调试,意思就是用开发单片机程序的计算机去模拟单片机的指令执行,并虚拟单片机片内资源,从而实现调试的目的,但是软件调试存在一些问题,如计算机本身是多任务系统,划分执行时间片是由操作系统本身完成的,无法得到控制,这样就无法时时的模拟单片机的执行时序,也就是说,不可能像真正的单片机运行环境那样执行的指令在同样一个时间能完成(往往要完成的比单片机慢)。为了解决软件调试的问题,第二种是硬件调试,硬件调试其实也需要计算机软件的配合,大致过程是这样的:计算机软件把编译好的程序通过串行口、并行口或者USB口传输到硬件调试设备中(这个设备叫仿真器),仿真器仿真全部的单片机资源(所有的单片机接口,并且有真实的引脚输出),仿真器可以接入实际的电路中,然后与单片机一样执行。同时,仿真器也会返回单片机内部内存与时序等情况给计算机的辅助软件,这样就可以在软件里看到真实的执行情况。不仅如此,还可以通过计算机断的软件实现单步、全速、运行到光标的常规调试手段。 图1:仿真器 总结一下两者的不同与相同: 相同点: 1:都可以检测单片机执行时序下的片内资源情况(如R0-R7 、PC计数器等) 2:可以实现断点、全速、单步、运行到光标等常规调试手段。 不同:

AS断点调试

1.设置断点 选定要设置断点的代码行,在行号的区域后面单击鼠标左键即可。 2.开启调试会话 点击红色箭头指向的小虫子,开始进入调试。 IDE下方出现Debug视图,红色的箭头指向的是现在调试程序停留的代码行,方法f2()中,程序的第11行。红色箭头悬停的区域是程

序的方法调用栈区。在这个区域中显示了程序执行到断点处所调用过的所用方法,越下面的方法被调用的越早。 3.单步调试 3.1 step over 点击红色箭头指向的按钮,程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行) 3.2 step into 点击红色箭头指向的按钮,程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法)。具体步骤如下:在自定义方法发f1()处设置断点,执行调试

点击

3.3 Force step into 该按钮在调试的时候能进入任何方法。 3.4 step out 如果在调试的时候你进入了一个方法(如f2()),并觉得该方法没有问题,你就可以使用stepout跳出该方法,返回到该方法被调用处的下一行语句。值得注意的是,该方法已执行完毕。 3.5 Drop frame

点击该按钮后,你将返回到当前方法的调用处(如上图,程序会回到main()中)重新执行,并且所有上下文变量的值也回到那个时候。只要调用链中还有上级方法,可以跳到其中的任何一个方法。 4. 高级调试 4.1 跨断点调试 设置多个断点,开启调试。

想移动到下一个断点,点击如下图: 程序将运行一个断点到下一个断点之间需要执行的代码。如果后面代码没有断点,再次点击该按钮将会执行完程序。 4.2 查看断点

Visual Studio调试之断点进阶篇

在上一篇文章Visual Studio调试之断点基础篇里面介绍了什么是断点,INT 是Intel 系列CPU的一个指令,可以让程序产生一个中断或者异常。程序中如果有中断或者异常发生了以后,CPU会中断程序的执行,去一个叫做IDT的部件查找处理这个中断(或者异常)的例程(Handler)。IDT是操作系统在启动的时候初始化的,至于IDT的细节问题,例如什么是IDT,怎样编写一个IDT的例程,怎样初始化IDT,可以去网上搜索一些资料。 总之,这里我们只要知道,CPU在执行程序指令过程中,碰到INT 3中断程序的执行,CPU 然后去IDT表里面找到处理断点的例程入口。这个例程要做的事情就是: 1.先看看机器里面是不是安装了一个调试器—记住,这一步很重要,之所以重要以 后的文章里面会介绍。 2.如果机器里面没有安装调试器,那么操作系统就会终止程序的执行。 3.否则操作系统启动调试器,并将调试器附到进程上。 4.这样,我们才能在调试器里面检查程序内部变量的值。 前面文章里面的INT 3 (或者DebugBreak(),或者Debugger.Break())指令是我们自己在代码里面硬编码进去的,因此我们在Visual Studio里,在相应的代码行里面点一下,出现一个小红球,也就是说Visual Studio在程序指令集某个地方动态地添加了一个INT 3指令。现在的问题来了,Visual Studio是如何在程序中正确找到插入INT 3指令的位置的? 或者更具体一些,我们在源代码(文本文件)里面设置断点的,Visual Studio需要把代码行翻译成在程序指令集中的位置。Visual Studio之所以需要做翻译,是因为通常一行C++或者C#代码都会对应好几行汇编指令。 因此,Visual Studio需要一个额外的文件来执行这个翻译过程,这个额外的文件叫做调试符号文件(Symbols),是由编译器生成的。Visual Studio系列的编译器,不论是C#、https://www.doczj.com/doc/c06514524.html,还是C++编译器都会生成这个调试符号文件,.pdb 文件。所以如果你花一点时间看看Debug文件夹的话,你就会发现这个文件。 因此我们来看看Visual Studio支持的各种断点,并解释各种断点的实现方式 条件断点 首先我们先看看如何设置条件断点,条件断点有两种,一种是根据触发的次数来设置,另外一种是根据一条预置的条件来设置。 根据触发次数设置 比如说,你有一个循环,循环1000次,你知道有一个BUG总是在500次之后才会出现,因此肯定希望在循环内设置一个断点,但是前面500次都不会触发这个断点,否则连续按500次的F5的确不是一件轻松的差事。

Eclipse项目开发常用快捷键

在Java项目开发中,使用到的eclipse工具拥有很多快捷键,熟练使用这些快捷键可以是让码代码的速度得到相当的提升,下面是总结的一些常用的快捷键,供大家参考. (注:文中箭头对应键盘方向键,黄色为使用频率非常高的快捷键) Ctrl+Alt+↓向下复制当前行 Ctrl+Alt+↑向上复制当前行 (很多人这两个快捷键无效,主要两个原因造成: 1:与播放器快捷键冲突,如网易云,QQ播放器,解决办法:找到播放器设置快捷键 2:与集显快捷键冲突,解决步骤如下: 点击鼠标右键→选择→→ →将快捷键设置为禁用以后,重启eclipse即可生效) Alt+/ 快捷提示,如某个类中的方法,字段.( 1:打开Eclipse,在导航栏选择打开" Window -Preferences"。

2:在目录树上选择"Java-Editor-Content Assist",在右侧的"Auto-Activation"找到"Auto Activation triggers for java"选项。默认触发代码提示的是"."这个符号3: 在"Auto Activation triggers for java"选项中,将"."更 改:.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ) Alt+↓移动当前行到下面一行 Alt+↑移动当前行到上面一行 Alt+←返回前一个编辑的页面 Alt+→到下一个编辑的页面 Alt+Shift+←选择上一个元素(根据鼠标光标位置),有时候选择复制一段代码可用 Alt+Shift+→选择下一个元素(同上) Alt+Enter快速显示当前文件的属性,如文件存放路径 Alt+Shift+S快速创建本类中的相关方法,如构造方法,实现或继承方法,get/set方法 Alt+Shift+W选中某个文件后,选择SystemExplorer可快速打开文件所在位置及其他相关信息(该快捷键仅支持高版本Eclipse,火星版本及以后) Ctrl+D 删除当前行 Ctrl+M当前窗口最大化 Ctrl+L定位到指定函数(也可直接点击编辑器右下角的SmartInsert) Ctrl+Q 定位到最后编辑的地方 Ctrl+F按下后,可输入查询关键字,查找该关键字在当前文件中的位置 Ctrl+K选中关键字,查找下一个关键字的位置 Ctrl+H打开查询窗口,可根据文件类型进行查找

实验一-Keil软件的使用及简单程序的调试方法

实验一Keil软件的使用及简单程序的调试方法 一、实验目的 掌握Keil的使用方法和建立一个完整的单片机汇编语言程序的调试过程及方法。 二、实验器材 计算机1台 三、实验内容 1.Keil的使用方法。 2.建立一个单片机汇编语言程序的调试过程及方法 四、实验步骤 1.Keil的使用方法。Keil C51 软件是众多单片机应用开发的优秀软件之一,它集编辑,编译,仿真于一体,支持汇编,PLM 语言和C 语言的程序设计,界面友好,易学易用。启动Keil 后的界面如下:

几秒钟后即进入Keil的编辑界面。用户便可建立项目及应用程序。 2.简单程序的调试方法 Keil是通过项目工程来管理汇编程序的。因此在调试程序前必须建立一个工程,工程名称及保存位置由用户来指定,注意每位同学的工程名称用“学号姓名实验*”来命名。 (1)建立一工程 单击Project菜单,在弹出的下拉菜单中选中New Project选项。并在弹出的对话框中确定保存的位置及工程名称。 又弹出一对话框,要求用户选择相应的硬件CPU及相关设置。选择Atmel公司的AT89C51单片机。如下图所示

单击“确定”后在弹出的对话框中行选择“否”即工程建好了,但该工程没有任何语句,需要再建一个程序文件并将其添加到此工程中。 (2)建一文件 单击“File”/“New”命令,则弹出文件的编辑窗口,此时该文件还没有指明其文件名称及保存位置,该文件还没有加载到所建立的工程中。单击“File”/“Save”命令在弹出的对话框中指明文件的类型为.ASM汇编型及文件名后单击“保存”即可进行汇编源文件的编辑。如下图所示。 (3)将文件添加到工程中 单击“T arget 1”前的“+”号则展开后变成“-”号,并右键单击“Source Group 1”在弹出的下拉菜单中执行“Add Files to Group ‘Source Group 1’”命令并弹出对话框在该对话框中的“文件类型”下拉列表中选择“Asm source file”后找到要添加的文件名并选中,单击“Add”即可。

如何高效使用GDB断点

在gdb中,断点通常有三种形式 断点(BreakPoint): 在代码的指定位置中断,这个是我们用得最多的一种。设置断点的命令是break,它通常有如下方式: 可以通过info breakpoints [n]命令查看当前断点信息。此外,还有如下几个配套的常用命令: 观察点(WatchPoint): 在变量读、写或变化时中断,这类方式常用来定位bug。

捕捉点(CatchPoint): 捕捉点用来补捉程序运行时的一些事件。如:载入共享库(动态链接库)、C++的异常等。通常也是用来定位bug。 捕捉点的命令格式是:catch ,event可以是下面的内容 自动删除。 捕捉点信息的查看方式和代码断点的命令是一样的,这里就不多介绍了。 在特定线程中中断 你可以定义你的断点是否在所有的线程上,或是在某个特定的线程。GDB很容易帮你完成这一工作。

break thread break thread if ... linespec指定了断点设置在的源程序的行号。threadno指定了线程的ID,注意,这个ID是GDB分配的,你可以通过"info threads"命令来查看正在运行程序中的线程信息。如果你不指定thread 则表示你的断点设在所有线程上面。你还可以为某线程指定断点条件。如: (gdb) break frik.c:13 thread 28 if bartab > lim 当你的程序被GDB停住时,所有的运行线程都会被停住。这方便你你查看运行程序的总体情况。而在你恢复程序运行时,所有的线程也会被恢复运行。那怕是主进程在被单步调试时。 在特定条件下中断 条件断点的一种特殊场景是在断点命中指定次数后停下来。事实上每个断点都有一个 ignore count, 他是一个正整数。通常情况下它的值为0,所以看不出来它的存在。但是如果它是一个非0值, 那么它将在每次命中后都将 count 减 1,直到它为 0. ignore bnum count 恢复程序运行和单步调试 在gdb中,和调试步进相关的命令主要有如下几条: 参考资料

Keil软件及其调试功能简介

Keil软件及其调试功能简介 目前流行的51系列单片机开发软件是德国Keil公司推出的Keil C51软件,它是一个基于32位Windows环境的应用程序,支持C 语言和汇编语言编程,其6.0以上的版本将编译和仿真软件统一为μVision(通常称为μV2)。Keil提供包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,由以下几部分组成:μVision IDE集成开发环境(包括工程管理器①、源程序编辑器②、程序调试器③,见图2)、C51编译器、A51汇编器、LIB51库管理器、BL51连接/定位器、OH51目标文件生成器以及Monitor-51、RTX51实时操作系统。 应用Keil进行软件仿真开发的主要步骤为:编写源程序并保存—建立工程并添加源文件—设置工程—编译/汇编、连接,产生目标文件—程序调试。Keil使用“工程”(Project)的概念,对工程(而不能对单一的源程序)进行编译/汇编、连接等操作。工程的建立、设置、编译/汇编及连接产生目标文件的方法非常易于掌握。首先选择菜单File-New…,在源程序编辑器中输入汇编语言或C语言源程序(或选择File-O pen…,直接打开已用其它编辑器编辑好的源程序文档)并保存,注意保存时必须在文件名后加上扩展名.asm(.a51)或.c;然后选择菜单Project-New Project…,建立新工程并保存(保存时无需加扩展名,也可加上扩展名.uv2);工程保存后会立即弹出一个设备选择对话框,选择CPU后点确定返回主界面。这时工程管理窗口的文件页(Files)会出现“Target1”,将其前面+号展开,接着选择Source Group1,右击鼠标弹出快捷菜单,选择“Add File to Group ‘Source Group1’”,出现一个对话框,要求寻找并加入源文件(在加入一个源文件后,该对话框不会消失,而是等待继续加入其它文件)。加入文件后点close返回主界面,展开“Source Group1”前面+号,就会看到所加入的文件,双击文件名,即可打开该源程序文件。紧接着对工程进行设置,选择工程管理窗口的Target1,再选择Project-Option for Target‘Target1’(或点右键弹出快捷菜单再选择该选项),打开工程属性设置对话框,共有8个选项卡,主要设置工作包括在Target选项卡中设置晶振频率、在Debug选项卡中设置实验仿真板等,如要写片,还必须在Output选项卡中选中“Creat Hex Fi”;其它选项卡内容一般可取默认值。工程设置后按F7键(或点击编译工具栏上相应图标)进行编译/汇编、连接以及产生目标文件。 成功编译/汇编、连接后,选择菜单Debug-Start/Stop Debug Session(或按Ctrl+F5键)进入程序调试状态,Keil提供对程序的模拟调试功能,内建一个功能强大的仿真CPU以模拟执行程序。Keil能以单步执行(按F11或选择Debug-Step)、过程单步执行(按F10或选择Debug-Step Over)、全速执行等多种运行方式进行程序调试。如果发现程序有错,可采用在线汇编功能对程序进行在线修改(Debug-Inline Assambly…),不必执行先退出调试环境、修改源程序、对工程重新进行编译/汇编和连接、然后再次进入调试状态的步骤。对于一些必须满足一定条件(如按键被按下等)才能被执行的、难以用单步执行方式进行调试的程序行,可采用断点设置的方法处理(Debug-Insert/Remove Breakpoint或Debug-Breakpoints…等)。在模拟调试程序后,还须通过编程器将.hex目标文件烧写入单片机中才能观察目标样机真实的运行状况。 Keil软件Eval版(免费产品)的功能与商业版相同,只是程序的最大代码量不得超过2kB,但对初学者而言已是足够。Keil软件由于其

Eclipse的debug操作手册

在本教程中,我们将看到使用Eclipse调试Java应用程序。调试可以帮助我们识别和解决应用程序中的缺陷。我们将重点放在运行时间的问题,而不是编译时错误。有提供像gdb的命令行调试器。在本教程中,我们将集中在基于GUI的调试,我们把我们最喜爱的IDE Eclipse来运行,通过本教程。虽然我们说的Eclipse,点大多是通用的,适用于调试使用的IDE像NetBeans。在看这篇文章前,我推荐你看一下Eclipse 快捷键手册,你也可以到这儿:下载PDF文件 我的eclipse版本是4.2 Juno。 0.三点特别提醒: ?不要使用System.out.println作为调试工具 ?启用所有组件的详细的日志记录级别 ?使用一个日志分析器来阅读日志 [ (System.out.println()对开发人员来说,有时候也许可以是一种调试手段,但是项目一旦完成他就没有什么用途了,就变成垃圾了,得必须注释或删除掉,这样会比较麻烦。启用所有组件的详细日志记录级别,运用日志分析器来记录详细系统运行状态,这对后期网站的优化和维护会有很多作用。)这仅仅是个人理解,仅供参考! ] 1.条件断点 想象一下我们平时如何添加断点,通常的做法是双击行号的左边。在debug视图中, BreakPoint View将所有断点都列出来,但是我们可以添加一个boolean类型的条件来决 定断点是否被跳过。如果条件为真,在断点处程序将停止,否则断点被跳过,程序继续执行。

2.异常断点 在断点view中有一个看起来像J!的按钮,我们可以使用它添加一个基于异常的断点,例如我们希望当NullPointerException抛出的时候程序暂停,我们可以这样: 3.观察点 这是一个很好的功能,他允许当一个选定的属性被访问或者被更改的时候程序执行暂停,并进行debug。最简单的办法是在类中声明成员变量的语句行号左边双击,就可以加入一个观察点。

keil调试经验

KEIL调试高级技巧 在调试状态,Debug 菜单项中的命令可以使用了,有关编译的工具栏按钮消失了,出现了一个用于运行和调试的工具栏,Debug 菜单上的大部份命令都有相应的快捷按钮。 从左到右依次是复位、运行、暂停、单步跟踪、单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮命令; 然后按一下图示第二个“运行”按钮。连接上相关的实验资源,本实验用一条 8PIN的数据排线把实验仪的CPU部份的P1口(JP44)连接到八路指示灯部份的JP32。这时你会看到实验仪的八个红色LED,轮流点亮,表示运行成功,也可以查看相关的变量和参数,非常方便。 ⒈单步跟踪运行 使用菜单Debug->Step 或上图第四个单步运行按钮或使用快捷键 F11 可以单 步跟踪执行程序,在这里我们按下 F11 键,即可执行该箭头所指程序行,每按一次 F11,可以看到源程序窗口的左边黄色调试箭头指向下一行,如果程序中有Delay延时子程序,则会进入延时程序中运行。 ⒉单步运行 如果Delay 程序有错误,可以通过单步跟踪执行来查找错误,但是如果 Delay 程序已正确,每次进行程序调试都要反复执行这些程序行,会使得调试效率很低,为此,可以在调试时使用 F10 来替代 F11(也可使用菜单 Step Over 或相应的命令按钮),在 main 函数中执行到 Delay时将该行作为一条语句快速执行完

毕。为了更好的进行对比,我们重新进入仿真环境,将反汇编窗口关闭,不断按F10 键,可以看到在源程序窗口中的左边黄色调试箭头不会进入到延时子程序。 ⒊全速运行 点击工具栏上的“运行”按钮或按F5 键启动全速运行,全速执行程序,此时用户板上的 P1 口所接 LED 以流水灯状态显示。 ⒋暂停 点击工具栏上的按钮,此时用户板上的P1 口所接 LED 停止以流水灯状态显示,只有一个 LED 灯点亮(取决于暂停前的 P1 的值)。 ⒌观察/修改寄存器的值 Project 窗口在进入调试状态后显示 Regs 页的内容,包括工作寄存器 R0~R7 的内容和累加器 A、寄存器 B、堆栈指针 SP 的内容。 用户除了可以观察以外还可自行修改,例如将寄存器a 的值 0x62 改为 0x85。方法一:用鼠标点击选中单元a,然后再单击其数值位置,出现文字框后输入0x85 按回车键即可; 方法二:在命令行窗口,输入A=0x85,按回车键将把 A 的数值设置为 0x85

eclipse断点调试指导

1.进入debug模式(基础知识列表) 1、设置断点 2、启动servers端的debug模式 3、运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域功能快捷键 全局单步返回F7 全局单步跳过F6 全局单步跳入F5 全局单步跳入选择Ctrl+F5 全局调试上次启动F11 全局继续F8 全局使用过滤器单步执行Shift+F5 全局添加/去除断点Ctrl+Shift+B 全局显示Ctrl+D 全局运行上次启动Ctrl+F11 全局运行至行Ctrl+R 全局执行Ctrl+U ============================= 1.Step Into (also F5) 跳入 2.Step Over (also F6) 跳过 3.Step Return (also F7) 执行完当前method,然后return跳出此

method 4.step Filter 逐步过滤一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering) 5.resume 重新开始执行debug,一直运行直到遇到breakpoint。 例如:A和B两个断点,debug过程中发现A断点已经无用,去除A 断点,运行resume就会跳过A直接到达B断点。 6.hit count 设置执行次数适合程序中的for循环(设置breakpoint view-右键hit count) 7.inspect 检查运算。执行一个表达式显示执行值 8.watch 实时地监视对象、方法或变量的变化 9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint. 10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂 11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint) 12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...) 断点属性: 1.hit count 执行多少次数后暂挂用于循环 2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂 3.suspend thread 多线程时暂挂此线程 4.suspend VM 暂挂虚拟机 13.variables 视图里的变量可以改变变量值,在variables 视图选择变

怎么样在KEIL_C软件中调试程序

首先建立工程。选[Project\New Project],选择工程保存的路径,及为工程命名。例如将其存放在D:\新建文件夹(2),命名为123。输入完工程名后会打开一个如下图所示的对话框,在这里我们选择CPU的型号,根据我们选用的CPU芯片的不同,这里的设置不同。在这里我们选用 Atmel\AT89C51。 接下来弹出一个如下图的对话框。该对话框提示你是否要把标准8051的启动代码添加到工程中去。如用C语言写程序,一般选“否”,但是,如果用到了某些增强功能需要初始化配置时,则可选“是”。在这里,我们选“否”,即不添加启动代码。 新建文件。在[File\New]建一个文件,将程序写入。这里以一个00-99秒计时器程序为例。程序如下 #include unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90}; //共阳数码管段0-9 unsigned char Second; delay10ms() //延时10毫秒 { unsigned int i,j; for(i=0;i<10;i++) for(j=0;j<120;j++); } leds() //显示子函数 { P0_0=0; //选通P0_0数码管 P2=table[Second/10]; //送段值 delay10ms(); //延时 P2=0xff; //消影 P0_0=1; //消除P0_0选通状态 P0_1=0; //选通P0_0数码管 P2=table[Second%10]; //送段值 delay10ms(); //延时 P2=0xff; //消影 P0_1=1; //消除P0_0选通状态 } void delay1s(void) //延时1秒 { unsigned char j; for(j=50;j>0;j--) leds(); } void main(void) { Second=0; //显示置0 while(1) //主循环 { delay1s();// 延时 Second++; //自加 if(Second==60) //判断是否到60

VS环境断点调试技巧_85920453_597709898

VS环境断点调试技巧 设置断点:在如下图中的红色圆点处设置断点,红色圆点表示已经在这行设置断点。 启动调试:按F5或者点击左边红框中的按钮。右边框是开始执行(不调试)Ctrl+F5。 调试工具栏:下面是工具栏中对应的名称和快捷键。 在调试过程中F5是执行到下一个断点。F11是逐语句,在执行到下图中的断点时,按F11会执行到Fibonacci方法里面逐步记录执行过程。F10是逐过程,与逐语句不同的是,在执行到下图中断点时,再执行会执行断点下面的语句,而不是去执行语句中的方法。

局部变量:在调试过程中可以查看局部变量窗口,如下图里面会有变量的当前状态。如果找不到的话在 数组的状态表示如下图: InteliTrace记录每一步的调试状态。

条件中断 开发人员设置断点,运行程序,利用不同的输入触发断点,然后在断点处手工检查是否满足某些特定的条件,从而决定是否继续调查。如果当前场景不是他们想要的,按F5继续运行程序,尝试别的输入,手动重复刚才的过程。 针对上述情况,Visual Studio提供了一个方便得多的功能——“条件中断”。只有当程序满足了开发人员预设的条件后,条件断点才会被触发,调试器中断。这将避免频繁地手工检查/恢复程序运行,大量减少调试过程中的手工和烦琐工作。 如何设置条件断点: 设置条件断点非常容易。在特定的行上,按F9设置断点。 然后右击断点–编辑窗口左侧的红点,在上下文菜单上选择“条件”。 这时弹出一个对话框供你设置激活该断点所需的条件。比如:我们希望只有当x==5时,调试才中断。我们可以写出如下的表达式:

现在我再运行这个程序按F5达到条件断点,只有当x等于5时,程序运行才会被中断。对于其它条件下的x值,断点将被跳过。 记录到达断点次数 有时你希望,只有当第N次满足条件的运行到达断点时,才中断程序运行。例如:当第一次命中断点。可以通过右击断点,然后在弹出菜单上选择“命中次数”菜单命令实现。 这时系统弹出一个对话框,它允许你指定:(1)当满足条件,而且进入断点的累计次数等于N时,断点命中一次。(2)当满足条件,而且进入断点的累计次数是N的倍数时,断点命中一次。(3)当满足条件,而且进入断点的累计次数大于N时,每次命中断点。 注意:如果多个条件同时用的话,结果取交集。

eclipse debug (调试)

eclipse debug (调试) 学习心得 进入debug模式: 1、设置断点 2、启动servers端的debug模式 3、运行程序,在后台遇到断点时,进入debug调试状态 ============================= 作用域功能快捷键 全局单步返回 F7 全局单步跳过 F6 全局单步跳入 F5 全局单步跳入选择 Ctrl+F5 全局调试上次启动 F11 全局继续 F8 全局使用过滤器单步执行 Shift+F5 全局添加/去除断点 Ctrl+Shift+B 全局显示 Ctrl+D 全局运行上次启动 Ctrl+F11 全局运行至行 Ctrl+R 全局执行 Ctrl+U ============================= 1.Step Into (also F5) 跳入 2.Step Over (also F6) 跳过 3.Step Return (also F7) 执行完当前method,然后return跳出此method 4.step Filter 逐步过滤一直执行直到遇到未经过滤的位置或断点(设置Filter:window-preferences-java-Debug-step Filtering) 5.resume 重新开始执行debug,一直运行直到遇到breakpoint。 例如:A和B两个断点,debug过程中发现A断点已经无用,去除A断点,运行resume就会跳过A直接到达B断点。 6.hit count 设置执行次数适合程序中的for循环(设置 breakpoint view-右键hit count) 7.inspect 检查运算。执行一个表达式显示执行值 8.watch 实时地监视对象、方法或变量的变化 9.我们常说的断点(breakpoints)是指line breakpoints,除了line breakpoints,还有其他的断点类型:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint. 10.field breakpoint 也叫watchpoint(监视点) 当成员变量被读取或修改时暂挂 11.添加method breakpoint 进入/离开此方法时暂挂(Run-method breakpoint) 12.添加Exception breakpoint 捕抓到Execption时暂挂(待续...) 断点属性: 1.hit count 执行多少次数后暂挂用于循环 2.enable condition 遇到符合你输入条件(为ture\改变时)就暂挂

keil c 的在线调试与断点设置

Keil 的调试命令、在线汇编与断点设置 上一讲中我们学习了如何建立工程、汇编、连接工程,并获得目标代码,但是做到这一步仅仅代表你的源程序没有语法错误,至于源程序中存在着的其它错误,必须通过调试才能发现并解决,事实上,除了极简单的程序以外,绝大部份的程序都要通过反复调试才能得到正确的结果,因此,调试是软件开发中重要的一个环节,这一讲将介绍常用的调试命令、利用在线汇编、各种设置断点进行程序调试的方法,并通过实例介绍这些方法的使用。 一、常用调试命令 在对工程成功地进行汇编、连接以后,按Ctrl+F5 或者使用菜单 Debug->Start/Stop Debug Session 即可进入调试状态,Keil 内建了一个仿真CPU 用来模拟执行程序,该仿真CPU 功能强大,可以在没有硬件和仿真机的情况下进行程序的调试,下面将要学的就是该模拟调试功能。不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。 进入调试状态后,界面与编缉状态相比有明显的变化,Debug 菜单项中原来不能用的命令现在已可以使用了,工具栏会多出一个用于运行和调试的工具条,如图1 所示,Debug 菜单上的大部份命令可以在此找到对应的快捷按钮,从左到右依次是复位、运行、暂停、单步、过程单步、执行完当前子程序、运行到当前行、下一状态、打开跟踪、观察跟踪、反汇编窗口、观察窗口、代码作用范围分析、1#串行窗口、内存窗口、性能分析、工具按钮等命令。 接着执行下一行程序,中间不停止,这样程序执行的速度很快,并可以看到该 段程序执行的总体效果,即最终结果正确还是错误,但如果程序有错,则难 以确认错误出现在哪些程序行。单步执行是每次执行一行程序,执行完该行 程序以后即停止,等待命令执行下一行程序,此时可以观察该行程序执行完 以后得到的结果,是否与我们写该行程序所想要得到的结果相同,借此可以 找到程序中问题所在。程序调试中,这两种运行方式都要用到。 使用菜单STEP 或相应的命令按钮或使用快捷键F11 可以单步执行程序, 使用菜单STEP OVER 或功能键F10 可以以过程单步形式执行命令,所谓 过程单步,是指将汇编语言中的子程序或高级语言中的函数作为一个语句来

od破解调试秘籍断点

拦截窗口: bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 拦截消息框: bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 拦截警告声: bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声) 拦截对话框: bp DialogBox 创建模态对话框 bp DialogBoxParam(A) 创建模态对话框 bp DialogBoxIndirect 创建模态对话框 bp DialogBoxIndirectParam(A) 创建模态对话框 bp CreateDialog 创建非模态对话框 bp CreateDialogParam(A) 创建非模态对话框 bp CreateDialogIndirect 创建非模态对话框 bp CreateDialogIndirectParam(A) 创建非模态对话框 bp GetDlgItemText(A) 获取对话框文本 bp GetDlgItemInt 获取对话框整数值 拦截剪贴板: bp GetClipboardData 获取剪贴板数据 拦截注册表: bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健 bp RegQueryValue(A) 查找子健 bp RegQueryValueEx 查找子健 bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健 功能限制拦截断点: bp EnableMenuItem 禁止或允许菜单项 bp EnableWindow 禁止或允许窗口 拦截时间:

Eclipse常见问题及解决方法

、修改字体大小 二、修改代码的背景颜色 先取消这个勾 备注:个人觉得看代码看久了眼睛会很累,所以建议把字体调大点和 背景颜色改成比较暗的比较好。 _r 二一- J * r 七 - 三、修改项目的编码格式。(防止导入项目出现中文注释乱码) 备注:这招不是万能的,有可能这样设置了还是产生中文乱码。 选择自己喜欢的颜 色, 或者自定义颜色

四、导入项目出现中文注释乱码的解决方法。 1.中文注释乱码症状: 2.解决方法:安装系统文件浏览器插件。 下载地址 3.安装方法:(文件插件,复制到你ecli pse安装目录下的plug ins文件夹内, 重启eclipse,就会在工具栏内有个快速打开图标)如图: 4.使用方法:(点击文件,在点插件的图标) 进入文件路径后,选中文件,用记事本打开: 用记事本打开文件后,全部复制代码,再回到ecl ip se里, 全部代替有乱码的代码,就行了。 五、还有几种出现错误的情况: 1.导入项目,工程文件显示有个红色的X,但没有具体显示 哪里错了。只显示下面这句话: An droid requires comp iler comp lia nee level or . Foun d" in stead. Please use An droid Tools > Fix Project Prop

erties. 解决方法:选中文件,右键->android tools->fix project properties 如下图: 2.导入文件,工程文件有个红色的叹号,或者没有生成文 件。 解决方法:clea n —下出现问题的工程。 3.找不到activity 类: Un able to find exp licit activity class {xxxx} 解决方法:在中增加activity 的申明,如: vactivity an droid: name=".xxxActivity" > 这里选中需要 clean 的工程。 六、Eclipse下的调试技巧 断点大家都比较熟悉,在Eclipse Java编辑区的行头双击就会得到一个断点,代码会运行到此处时停止。 条件断点,顾名思义就是一个有一定条件的断点,只有满足了用户设置的条件,代码才会在运行到断点处时 停止。 在断点处点击鼠标右键,选择最后一个"Break poi nt Prop erties" 断点的属性界面及各个选项的意思如下图, 2、变量断点

在KEIL C中调试程序

在KEIL C中调试程序 首先建立工程。选[Project\New Project],选择工程保存的路径,及为工程命名。例如将其存放在D:\新建文件夹(2),命名为123。输入完工程名后会打开一个如下图所示的对话框,在这里我们选择CPU的型号,根据我们选用的CPU芯片的不同,这里的设置不同。在这里我们选用Atmel\AT89C51。 接下来弹出一个如下图的对话框。该对话框提示你是否要把标准8051的启动代码添加到工程中去。如用C 语言写程序,一般选“否”,但是,如果用到了某些增强功能需要初始化配置时,则可选“是”。在这里,我们选“否”,即不添加启动代码。 新建文件。 在[File\New]建一个文件,将程序写入。这里以一个00-99秒计时器程序为例。程序如下 #include unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92, 0x82,0xf8,0x80,0x90}; //共阳数码管段0-9 unsigned char Second; delay10ms() //延时10毫秒

for(j=0;j<120;j++); } leds() //显示子函数 { 0_0=0; //选通P0_0数码管 P2=table[Second/10]; //送段值 delay10ms(); //延时 P2=0xff; //消影 P0_0=1; //消除P0_0选通状态 P0_1=0; //选通P0_0数码管 P2=table[Second%10]; //送段值 delay10ms(); //延时 P2=0xff; //消影 P0_1=1; //消除P0_0选通状态 } void delay1s(void) //延时1秒 { unsigned char j; for(j=50;j>0;j--) leds(); } void main(void) { Second=0; //显示置0 while(1) //主循环 { delay1s();// 延时 Second++; //自加 if(Second==60) //判断是否到60 { Second=0; //到60置0 } leds(); //显示子程序 } } 保存文件。选[File\Save],将其保存在刚建的工程下。这里是用的C语言编程,所以后缀名要加上”.C”。这里我们将其命名为“Text1.c“。注意扩展名“.C”不可省略。打开工程[Project\Open Project],在左窗口中单击右键,选“Add files to Group “Source Gropu 1“,将程序Text1.c加载到工程。只有经过这一步才能对程序进行下面的编译及调试。

黑马程序员java教程:断点调试模式运行java程序

断点调试模式运行java程序 1断点调试的目的 ●跟踪源代码; ●观察程序运行状态; 2调试程序1 编写求和代码 ●设置断点; ●debug运行; ●进入debug透视图; ●程序会运行到断点处停住; ●当前行还没有运行; ●查看变量值:选中变量→鼠标右键→Watch; ●F5(跳入)、F6(跳过)、F7(跳出); 3调试程序2 使用Arrays.binarySearch()编写折半搜索数组元素代码 ●设置断点; ●测试跳入; ●测试跳过; ●测试跳出; ●添加断点; ●测试进入下一断点; ●测试返回当前方法栈的头部(Drop To Frame); ●清除断点; ●清除表达式; ●注意,停止程序! MyEclipse快捷键 1MyEclipse常用快捷键1 ●Alt + /(内容助理):补全; ●Ctrl + 1(快速定位):出错时定位错误,与点击“红X”效果一样;

●Ctrl + Shift + O:导包; ●Ctrl + Shift + F:格式化代码块; 2MyEclipse常用快捷键2 ●Ctrl + Shift + T:查看源代码; ●Ctrl + 点击源代码:查看源代码; ●F3:查看选中类的源代码; ●Alt + 左键:查看源代码时的“原路返回”; ●Ctrl + Shift + X:把小写修改为大写; ●Ctrl + Shift + Y:把小写修改为小写; ●Ctrl + Alt + 下键:复制当前行; ●Ctrl + /:添加或撤销行注释; ●Ctrl + Shift + /:对选中代码添加段注释; ●Ctrl + Shift + \:撤销当前段注释; ●Alt + 上键:向上移动当前行; ●Alt + 下键:向上移动当前行; ●Ctrl + D:删除当前行; MyEclipse: ●工作空间; ●项目名称; ●包名; ●类名; ●Alt + /、Ctrl + 1、Ctrl + shift + o、Ctrl + shift + f

相关主题
文本预览
相关文档 最新文档