搜档网
当前位置:搜档网 › VC调试方法大全

VC调试方法大全

VC调试方法大全
VC调试方法大全

VC调试方法大全

VC调试方法大全

一、调试基础

调试快捷键

F5:开始调试

Shift+F5: 停止调试

F10:调试到下一句,这里是单步跟踪

F11:调试到下一句,跟进函数内部

Shift+F11: 从当前函数中跳出

Ctrl+F10: 调试到光标所在位置

F9:设置(取消)断点

Alt+F9: 高级断点设置

跟踪调试

1、尽量使用快捷键时行调试

2、观察调试信息

3、高级中断设置

异常调试

重试->取消->调试

函数堆栈,用variables或者call stack 窗口

Release调试

1、经常测试你的Debug和Release版本

2、不要移除调试代码,如用ASSERT, TRACE等。

3、初始化变量,特别是全局变量,malloc的内存,new的内存

4、当你移除某个资源时,确保你移除了所有跟这个资源相关的申明(主要是在resouce.h文中)

5、使用3或者4级的警告级编译你的代码,并确保没有警告,project->setting->c/c++->warninglevel(中文版是项目->属性->C/C++->常规->警告等级)

6、 _debug改成NDEBUG进行调试,project->setting->C/C++->Preprocessordefinitions(中文版是项目->属性->C/C++->预处理器->预处理定义)(这里是debug和Release编译的重要不同之一)

7、在Release中调试源代码,project->setting->C/C++->debug info选择programDataBase(中文版是项目->属性->C/C++->常规->调试信息格式->用于“编辑并继续”的程序数据库),project->setting->link选上Generate debug info(中文版是项目->属性->链接器->调试->生成调试信息)

8、走读代码,特别关注堆栈和指针

二、TRACE宏

当选择了Debug目标,并且afxTraceEnabled变量被置为TRUE时,TRACE宏也就随之被激活了。但在程序的Release版本中,它们是被完全禁止的。下面是一个典型的TRACE语句:

int nCount =9;

CString strDesc("total");

TRACE("Count =%d,Description =%s\n",nCount,strDesc);

可以看到,TRACE语句的工作方式有点像C语言中的printf语句,TRACE宏参数的个数是可变的,因此使用起来非常容易。如果查看MFC的源代码,你根本找不到TRACE宏,而只能看到TRACE0、TRACE1、TRACE2和TRACE3宏,它们的参数分别为0、1、2、3。

个人总结:最近看网络编程是碰到了TRACE语句,不知道在哪里输出,查了一晚上资料也没找出来,今天终于找到了,方法如下:

1.在MFC中加入TRACE语句

2.在TOOLS->MFCTRACER中选择“ENABLE TRACING”点击OK

3.进行调试运行,GO(F5)(特别注意:不是执行‘!’以前之所以不能看到TRACE内容,是因为不是调试执行,而是‘!’了,切记,切记)

4.然后就会在OUTPUT中的DEBUG窗口中看到TRACE内容了,调试执行会自动从BUILD窗口跳到DEBUG窗口,在那里就看到TRACE的内容了,^_^

以下是找的TRACE的详细介绍:

==============================

TRACE宏对于VC下程序调试来说是很有用的东西,有着类似printf的功能;该宏仅仅在程序的DEBUG版本中出现,当RELEASE的时候该宏就完全消失了,从而帮助你调式也在RELEASE的时候减少代码量。

使用非常简单,格式如下:

TRACE("DDDDDDDDDDD");

TRACE("wewe%d",333);

同样还存在TRACE0,TRACE1,TRACE2。。。分别对应0,1,2。。个参数

TRACE信息输出到VC IDE环境的输出窗口(该窗口是你编译项目出错提示的哪个窗口),但仅限于你在VC中运行你的DEBUG版本的程序。

TRACE信息还可以使用DEBUGVIEW来捕获到。这种情况下,你不能在VC的IDE环境中运行你的程序,而将BUILD好的DEBUG版本的程序单独运行,这个时候可以在DEBUGVIEW的窗口看到DEBUGVIE格式的输出了。VC中TRACE的用法有以下四种:

TRACE1 ,就是不带动态参数输出字符串, 类似C的printf("输出字符串");

TRACE2: 中的字符串可以带一个参数输出 ,类似C的printf("...%d",变量);

TRACE3:可以带两个参数输出,类似C的printf("...%d...%f",变量1,变量2);

TRACE4 可以带三个参数输出,类似C的printf("...%d,%d,%d",变量1,变量2,变量3);

TRACE 宏有点象我们以前在C语言中用的Printf函数,使程序在运行过程中输出一些调试信息,使我们能了解程序的一些状态。但有一点不同的是:

TRACE 宏只有在调试状态下才有所输出,而以前用的Printf 函数在任何情况下都有输出。和Printf 函数一样,TRACE函数可以接受多个参数如:

int x = 1;

int y = 16;

float z = 32.0;

TRACE( "This is a TRACE statement\n" );

TRACE( "The value of x is %d\n", x );

TRACE( "x = %d and y = %d\n", x, y );

TRACE( "x = %d and y = %x and z = %f\n", x, y, z );

要注意的是TRACE宏只对Debug 版本的工程产生作用,在Release 版本的工程中,TRACE宏将被忽略。

三、ASSERT宏

如果你设计了一个函数,该函数需要一个指向文档对象的指针做参数,但是你却错误地用一个视图指针调用了这个函数。这个假的地址将导致视数据的破坏。现在,这种类型的问题可以被完全避免,只要在该函数的开始处实现一个ASSERT测试,用来检测该指针是否真正指向一个文档对象。一般来讲,编程者在每个函数的开始处均应例行公事地使用assertion。ASSERT宏将会判断表达式,如果一个表达式为真,执行将继续,否则,程序将显示一条消息并且暂停,你可以选择忽视这条错误并继续、终止这个程序或者是跳到Debug器中。下面一例演示了如何使用一个ASSERT宏去验证一个语句。

void foo(char p, int size )

{

ASSERT( p != 0 ); //确认缓冲区的指针是有效的

ASSERT( ( size >= 100 ); //确认缓冲区至少有100个字节

// Do the foo calculation

}

这些语句不产生任何代码,除非—DEBUG处理器标志被设置。Visual C++只在Debug版本设置这些标志,而在Release版本不定义这些标志。当—DEBUG被定义时,两个assertions将产生如下代码:

//ASSERT( p!= 0 );

do{

if( !(p !=0) && AfxAssertFailedLine(—FILE—,—LINE—) )

AfxDebugBreak();

}while(0);

//ASSERT((size 〉= 100);

do{

if(!(size 〉= 100) &&AfxAssertFailedLine(—FILE—,—LINE—))

AfxDebugBreak();

}while(0);

Do-while循环将整个assertion封装在一个单独的程序块中,使得编译器编译起来很舒畅。If语句将求取表达式的值并且当结果为零时调用AfxAssertFailedLine()函数。这个函数将弹出一个对话框,其中提供三个选项“取消、重试或忽略”,当你选取“重试”时,它将返回TRUE。重试将导致对AfxDebugBreak()函数的调用,从而激活调试器。AfxAssertFailedLine()是一个未正式公布的函数,它的功能就是显示一个消息框。该函数的源代码驻留在afxasert.cpp中。函数中的—FILE—和—LINE—语句是处理器标志,它们分别指定了源文件名和当前的行号。

AfxAssertFailedLine()是一个未正式公布的函数,它的功能就是显示一个消息框。该函数的源代码驻留在afxasert.cpp中。函数中的—FILE—和—LINE—语句是处理器标志,它们分别指定了源文件名和当前的行号。

四、VERIFY 宏

因为assertion只能在程序的Debug版本中起作用,在表达式中不可以包含赋值语句、增加语句(++)或者是减少语句(--),因为,这些语句实际改变数据。可有时你可能想要验证一个能动的表达式,使用一个赋值语句。那么就到了用VERIFY宏来替代ASSERT。例如:

voidfoo(char p, int size )

{

char q;

VERIFY(q = p);

ASSERT((size 〉= 100);

//Do the foo calculation

//Do the foo calculation

}

在Debug模式下,ASSERT和VERIFY是一回事,但是在Release模式下,VERIFY宏仍然测试表达式而assertion却不起任何作用。可以说,在Release模式下,ASSERT语句被删除了。

请注意,如果你在一个ASSERT语句中错误地使用了一个能动的表达式,编译器将不做任何警告地忽略它。在Release模式下,该表达式就会被无声息地删除掉,这将会导致程序的错误运行。由于Release版的程序通常不包含Debug信息,这类错误将很难被发现。

五、VC高级调试方法-条件及数据断点的设定

(一)位置断点(LocationBreakpoint)

大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码:

void CForDebugDlg::OnOK()

{

for(int i = 0; i < 1000; i++) //A

{

intk = i * 10 - 2; //B

SendTo(k); //C

inttmp = DoSome(i); //D

Trace0("这里要输出的内容”);//在这里可以输出一些有用的信息,你也可以输出I的值,都是可以的

intj = i / tmp; //E

}

}

//其实我们还可以用其他方法调式也是一样的,你可以用TRACE0宏来输出循环中的每一个结果,我们也可以在debug中看见输出的结果,当出现问题时,输出的结果可能就不一样了,我们可以分析一下debug中的结果找出问题的所在

执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。这样手要不停的按,很痛苦。使用VC6断点修饰条件就可以轻易解决此问题。步骤如下。

1 Ctrl+B打开断点设置框,如下图:

Figure 1设置高级位置断点

2 然后选择D行所在的断点,然后点击condition按钮,在弹出对话框的最下面一个编辑框中输入一个很大数目,具体视应用而定,这里1000就够了。

3 按F5重新运行程序,程序中断。Ctrl+B打开断点框,发现此断点后跟随一串说明:...487 times remaining。意思是还剩下487次没有执行,那就是说执行到513(1000-487)次时候出错的。因此,我们按步骤2所讲,更改此断点的skip次数,将1000改为513。

4 再次重新运行程序,程序执行了513次循环,然后自动停在断点处。这时,我们就可以仔细查看DoSome是如何返回0的。这样,你就避免了手指的痛苦,节省了时间。

再看位置断点其他修饰条件。如Figure 1所示,在“Enter the expression to be evaluated:”下面,可以输入一些条件,当这些条件满足时,断点才启动。譬如,刚才的程序,我们需要i为100时程序停下来,我们就可以输入在编辑框中输入“i==100”。

另外,如果在此编辑框中如果只输入变量名称,则变量发生改变时,断点才会启动。这对检测一个变量何时被修改很方便,特别对一些大程序。

用好位置断点的修饰条件,可以大大方便解决某些问题。

(二)数据断点(DataBreakpoint)

软件调试过程中,有时会发现一些数据会莫名其妙的被修改掉(如一些数组的越界写导致覆盖了另外的变量),找出何处代码导致这块内存被更改是一件棘手的事情(如果没有调试器的帮助)。恰当运用数据断点可以快速帮你定位何时何处这个数据被修改。譬如下面一段程序:

#include "stdafx.h"

#include

int main(int argc, char* argv[])

{

charszName1[10];

charszName2[4];

strcpy(szName1,"shenzhen");

printf("%s\n",szName1); //A

strcpy(szName2,"vckbase"); //B

printf("%s\n",szName1);

printf("%s\n",szName2);

return0;

}

这段程序的输出是

szName1: shenzhen

szName1:ase

szName2:vckbase

首先我给你分析一下为什么会是这样的结果呢!首先你在strcpy(szName1,"shenzhen");这个地方F9设置一个断点,然后F5运行程序,这是程序会断到我们设置的断点,如下图

看到了吧,问题出现的原因就在这里,系统给szName2分配的地址是0x0012ff70这里是4个字节,然后呢,在0x0012ff70后面4个字节处,开始分配szName1这10个字节,也就是在0x0012ff74处开始分配10个字节, F10单步跟踪,来到printf("%s\n", szName1)这一行,如下图

szName1分配的空间已经附上了值.

F10走到下一个printf("%s\n", szName1) 看下图,

因为szName1 和szName2分配的空间是连续的,所以给szName2赋值超过所容纳的字节时就开始覆盖szName1的内容了,所以说当我们在输出结果的时候就出现我们想不到的结果了,

那么怎么去调试呢,下面是具体的方法

szName1何时被修改呢?因为没有明显的修改szName1代码。我们可以首先在A行设置普通断点,F5运行程序,程序停在A行。然后我们再设置一个数据断点。如下图:

Figure 2数据断点

F5继续运行,程序停在B行,说明B处代码修改了szName1。B处明明没有修改szName1呀?但调试器指明是这一行,一般不会错,所以还是静下心来看看程序,哦,你发现了:szName2只有4个字节,而strcpy了7个字节,所以覆写了szName1。

数据断点不只是对变量改变有效,还可以设置变量是否等于某个值。譬如,你可以将Figure 2中红圈处改为条

件”szName2[0]==''''y''''“,那么当szName2第一个字符为y时断点就会启动。

可以看出,数据断点相对位置断点一个很大的区别是不用明确指明在哪一行代码设置断点。

(三)其他

1 在call stack窗口中设置断点,选择某个函数,按F9设置一个断点。这样可以从深层次的函数调用中迅速返回到需要的函数。

2 Set Next StateMent命令(debug过程中,右键菜单中的命令)

此命令的作用是将程序的指令指针(EIP)指向不同的代码行。譬如,你正在调试上面那段代码,运行在A行,但你不愿意运行B行和C行代码,这时,你就可以在D行,右键,然后“Set Next StateMent”。调试器就不会执行B、C行。只要在同一函数内,此指令就可以随意跳前或跳后执行。灵活使用此功能可以大量节省调试时间。

3 watch窗口

watch窗口支持丰富的数据格式化功能。如输入0x65,u,则在右栏显示101。

实时显示windows API调用的错误:在左栏输入@err,hr。

在watch窗口中调用函数。提醒一下,调用完函数后马上在watch窗口中清除它,否则,单步调试时每一步调试器都会调用此函数。

4 messages断点不怎么实用。基本上可以用前面讲述的断点代替。

六。VC调试环境设置

为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。

为了增加调试信息,可以按照下述步骤进行:

打开Projectsettings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开)

选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括:

命令行 Project settings 说明

无 None 没有调试信息

/Zd Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息

/Z7 C7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等

/Zi Program Database 创建一个程序库(PDB),包括类型信息和符号调试信息。

/ZI Program Databasefor

Edit and Continue 除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效

选择Link页,选中复选框"Generate DebugInfo",这个选项将使连接器把调试信息写进可执行文件和DLL

如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。

如何用VC6.0调试代码(入门)

概述 调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。 这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。 本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。 设置 为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的 Configuration中增加调试信息,包括Release版本。 为了增加调试信息,可以按照下述步骤进行: 打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开) 选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括: None 没有调试信息 Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息 C 7 Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等 Program Database 创建一个程序库(PDB),包括类型信息和符号调试信息。 Program Database for Edit and Continue 除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效 选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL 。 如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。 断点 断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。断点是最常用的技巧。调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。 设置断点:可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上,然后按F9快捷键弹出Breakpoints对话框,方法是按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints打开。打开后点击Break at编辑框的右侧的箭头,选择合适的位置信息。一般情况下,直接选择line xxx就足够了,如果想设置不是当前位置的断点,可以选择

CAD调试小技巧

关于CAD比例调试和标注样式的几点说明 一、CAD比例调试说明: 1.绘图 用CAD绘图时,一般按照1:1的比例绘制,换句话说,如果绘制1m的直线,则在CAD画线命令中输入1000(单位为mm),如图1所示。 图1 2.绘制图框 按照如上所说绘制完成所有工程图后,根据图号要求设置比例,现在以二号图为例进行说明,图2是按照1:1绘制的直线,现要将其设置为二号图进行打印,所以按照1:1绘制完成所有工程图后,根据图号尺寸绘制图框(二号图为594mm ×420mm),图框绘制见图3。 图2 图3

3.比例设置 比例设置方法有两种: 方法一:按比例放大图框,根据所绘图形大小,预估图框需要放大倍数(图框放大比例原则是图形在图框中适中),本例中图框放大两倍,缩放命令是SC。将图框全部选中,输入“SC”(如图4)然后回车,选择基点输入放大倍数2(如图5)。然后将图形放入放大后的图框中(见图6),图形比例即为1:2,这样就完成了图形比例设置。但是图框不再是标准图框,而是标准图框的倍数,所以,只要在打印时设置为二号图框打印,对出图无影响。 图4 图5

图6 方法二:按比例缩小图形,根据所绘图形和图框大小,估计图形需要缩小倍 数(原则和方法一相同),本例中估计需要缩小2倍。和方法一一样,选中所有 图形,输入SC 回车,然后选择基点输入0.5(即X 1 ,X 为缩小倍数) ,然后将图 形移入图框中(见图7)。 图7 使用这种方法后,它的标注尺寸不再是实际尺寸,现在就需要调整测量单位比例因子。根据流程一操作,在测量单位比例因子中输入图形缩小倍数2,然后确定,图形比例即为1:2,结果见图8。

vc++6.0_调试详细教程(17种方法)

vc++6.0 调试详细教程 Step into Step over Step out Run to cursor Watch Variables Registers Memory Stop Debug Call stack Disassembly Restart Debugger 2、调试的一般过程 调试,就是在程序的运行过程的某一阶段观测程序的状态。在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。我们所做的第一项工作就是设立断点;其次再运行程序;当程序在设立断点处停下来时,利用各种工具观察程序的状态。

程序在断点停下来后,有时我们需要按我们的要求控制程序的运行,以进一步观测程序的流向。 下面我们依次来介绍断点的设置,如何控制程序的运行以及各种观察工具的利用。 3、设置断点 在VC中,可以设置多种类型的断点,根据断点起作用的方式把这些断点分为三类: 1、与位置有关的断点; 2、与逻辑条件有关的断点 3、与WINDOWS消息有关的断点。 主要介绍前面两种断点。 4、设置位置断点 最简单的是设置一般位置断点: ?把光标移到你要设断点的位置,当然这一行必须包含一条有效语句的; ?然后按工具条上的add/remove breakpoint 按钮或按快捷键F9。 将会在屏幕上看到在这一行的左边出现一个红色的圆点表示这里设立了一个断点

5、设置位置断点-图示 6、设置逻辑断点 有的时候可能不需要程序每次运行到这儿都停下来,而是在满足一定条件的情况下才停下来,这时就需要设置一种与位置有关的逻辑断点。 从EDIT 菜单中选中Breakpoints命令,这时Breakpoints对话框将会出现在屏幕上。选中Breakpoint对话框中的Location标签,使Location页面弹出。 如下页图所示。

软件调试技巧

软件调试技巧 一、软件调试方法 软件调试有很多种方法。常用的有4种,即强行排错法、回溯排错法、归纳排错法和演绎排错法。 1.强行排错法 这种方法需要动脑筋动的地方比较少,因此叫强行排错。通常有以下3种表现形式: ●打印内存变量的值。在执行程序时,通过打印内存变量的数值,将该数值同预期的数值进行比较,判 断程序是否执行出错。对于小程序,这种方法很有效。但程序较大时,由于数据量大,逻辑关系复杂,效果较差。 ●在程序关键分支处设置断点,如弹出提示框。这种方法对于弄清多分支程序的流向很有帮助,可以很 快锁定程序出错发生的大概位置范围。 ●使用编程软件的调试工具。通常编程软件的IDE集成开发环境都有调试功能,使用最多的就是单步调 试功能。它可以一步一步地跟踪程序的执行流程,以便发现错误所在。 2.回溯排错法 这是在小程序中常用的一种有效的调试方法。一旦发现了错误,可以先分析错误现象,确定最先发现该错误的位置。然后,人工沿程序的控制流程,追踪源程序代码,直到找到错误根源或确定错误产生的范围。 3.归纳排错法 归纳法是一种从特殊推断一般的系统化思考方法。归纳法调试的基本思想是,从一些线索(错误的现象)着手,通过分析它们之间的关系来找出错误,为此可能需要列出一系列相关的输入,然后看哪些输入数据的运行结果是正确的,哪些输入数据的运行结果有错误,然后加以分析、归纳,最终得出错误原因。 4.演绎排错法 演绎法是一种从一般原理或前提出发,经过排除和精化的过程来推导出结论的思考方法。调试时,首先根据错误现象,设想及枚举出所有可能出错的原因作为假设。然后再使用相关数据进行测试,从中逐个排除不可能正确的假设。最后,再用测试数据验证余下的假设是否是出错的原因。 二、调试的原则 调试能否成功一方面在于方法,另一方面很大程度上取决于个人的经验。但在调试时,通常应该遵循以下一些原则。 1.确定错误的性质和位置的原则 用头脑去分析思考与错误征兆有关的信息,避开死胡同。调试工具只是一种辅助手段。利用调试工具可以帮助思考,但不能代替思考。通常避免使用试探法,最多只能将它当作最后的手段,毕竟小概率事件有时也会发生。 2.修改错误的原则 在出现错误的地方,很可能还有别的错误。修改错误的一个常见失误是只修改了这个错误的征兆或这个错误的表现,而没有修改错误本身。当新修正一个错误的同时又引入新的错误。 三、有效减少调试时间 1.绘制程序流程图 一些程序员认为,绘制程序流程图是件繁琐的事,而且浪费时间。其实不然,当读者对着偌大的程序一筹莫展时,面对纷纭复杂的关系理不出头绪时,使用程序流程图绝对可以事半功倍。 因此建议在编制程序前先绘制流程图,这样编程的思路有条理,调试时同样会有条不紊。若编制程序之前没有绘制流程图,当排错没有进展时,可以马上编写流程图。你会发现,程序中某些分支或细节被忽略了,这些细节可能就是程序出错的地方。 2.不要过多地依赖单步调试 有些程序对时间很敏感。数据只在那么一瞬间有效,可谓稍纵即逝。所以等到单步执行到那里时,

vc debug 方法

了解调试,首先要知道"断点"这个概念.断点就是程序运行中可能会中断的地方,方便开发者在程序运行的过程中查看程序当前的运行状态,比如变量的值,函数的返回值等等.究竟怎么使用断点呢? 1.调试快捷键 F9——在当前光标所在的行下断点,如果当前行已经有断点,则取消断点. F5——调试状态运行程序,程序执行到有断点的地方会停下来. F10——单步执行程序. F11——和F10的区别是,如果当前执行语句是函数调用,则会进入函数里面. CTRL+F10——运行到光标所在行. SHIFT+F11——跳出当前所在函数. 特别说明: a.有的地方不能下断点.比如空行,基本类型定义语句(不初始化),等等非执行语句.比如 int i; // 此行不能下断点字串7 int j = 0; // 这里可以下 CString str; // 这里可以下 int k = Max(i, j); // 这里可以下 b.不是所有断点都会(断).比如下断点的语句在程序里面没有被执行. c.此外,ALT+F9还可以下条件断点,不过这个不常用,有兴趣的可以自己研究:) 2.如何调试Release版的程序? 有些程序在debug下运行的很好,但在release下却总是失败,默认情况下release是不能调试的.怎么解决呢? 其实"debug"和"release"都只是一个代号而已,各自对应一组不同的编译选项. 在release的默认设置下,ALT+F7 ,调出工程设置对话框,切换到link选项卡,勾选"Generate debug info",然后再切换到C/C++选项卡,在"Optimizations"里面选"Disable(Debug)",在下面的"Debug info"里面选"Program Database for Edit and Continue".然后点OK保存设置,重新编译程序,下断点即可.

教你如何调节人声音色的调试技巧

教你如何调节人声音色的调试技巧 人声音色的调试技巧 1. 人声是一个复合音。也就是由声音的基音和一系列的泛音所构成。这些泛音都是基音频率的位数,物理学叫分音,电声学叫谐波,音乐中叫泛音。低频泛音的幅度较强,音色就表现得混厚;中频泛音的幅度比较强,音色就表现得圆润、自然、和谐;高频泛音的幅度比较强,音色就表现得明亮、清透、解析力强。 2. 如果高频段频率过弱,其音色就变得灰哑、缺少韵味、和个性;如果高频段频率过强,音色就会变得尖噪、刺耳。 如果中高频段的频率过弱,音色就变得暗淡、朦胧;如果中高频段的频率过强,其音色就会变得呆板。 3. 如果低频段的频率过弱,音色将会变得单薄、苍白;如果低频段的频率过强,音色会变得浑浊不清。 音响话筒怎样调节使用效果好! 调试篇 1.怎样调好话筒? 目前流行、通俗的演唱使用的动圈话筒音箱摆放尽量不要把话筒拾音区域覆盖进去。唱歌底气不足的加中高频,突出他的亮,底气很足的减低频,省得声音破掉,女人加低频声音厚,男人加高频声音透。 2.如何调音? ①设备的开、关机顺序 由音源设备(CD机、DVD机、)、音频处理设备(效果器、等)到功率放大器到电视机、投影机、。关机时顺序相反,应先关功放。这样操作可以防止开、关机对设备的冲击,防止烧毁功放和扬声器。 KTV音响声道系统三大的特点 声道系统的特点: 第一从声音效果上,能够使声音的密度感更好,声场更加宽阔,能够很好的营造出临场感和现场气氛,声场的密度感大大增加歌唱时倍感轻松, ◆第二从声压水平上来看,采用三只辅助音响能够使较小尺寸的音箱达到相同的声音量感和声压水平,这样更加便于我们进行箱体的安装,使其更好的溶入装修之中。同时在低频的表现上来看,多只小尺寸的扬声器的低频速度感比单只大口径扬声器单元更好,主观听感的冲击力和刺激感更加强烈,表现的声底将更干净,清晰。 第三从音箱运行安全性上,众所周知卡拉OK 音箱的扬声器是很容易损坏的,除了摔MIC,啸叫等

VC6常用调试方法

VC6常用调试方法.txt什么叫神话?请听男人向你表达爱意;什么叫传说?请听男人对你的承诺;什么叫梦境?请看你自己听到前两者时的反应。 1.检测程序中的括号是否匹配 把光标移动到需要检测的括号(如大括号{}、方括号[]、圆括号()和尖括号<>)前面,键入快捷键“Ctrl+]”。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告声。 2.查看一个宏(或变量、函数)的宏定义 把光标移动到你想知道的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的Go To Defition Of …),如果没有建立Browse files,会出现提示对话框,确定,然后就会跳到定义那些东西的地方。 3.格式化一段乱七八糟的源代码 选中那段源代码,按ATL+F8。 4.在编辑状态下发现成员变量或函数不能显示 删除该项目扩展名为.ncb文件,重新打开该项目。 5.如何整理ClassView视图中大量的类 可以在classview 视图中右键新建文件夹(new folder),再把具有相近性质的类拖到对应的文件夹中,使整个视图看上去清晰明了. 6.定位预处理指定 在源文件中定位光标到对称的#if, #endif,使用Ctrl+K. 7.如何添加系统中Lib到当前项目 在Project | Settings | Link | Object/library modules:输入Lib名称,不同的Lib之间用空格格开. 8.如何添加系统中的头文件(.h)到当前项目. #include ,告诉编译到VC系统目录去找;使用#include "FileName.h",告诉编译在当前目录找. 9.如何在Studio使用汇编调试 在WorkBench的Debugger状态下按CTRL+F7. 10.怎样处理ClassZiard找不到的系统消息 如果要在ClassWizard中处理WM_NCHITTEST等系统消息,请在ClassWizard中Class Info 页中将Message filter改为Window就有了. 11.如何干净的删除一个类 先从Workspace中的FileView中删除对应的.h和.cpp文件,再关闭项目,从实际的文件夹中删除对应的.h和.cpp文件与.clw文件。

vc6调试入门

Q: 在设置断点调试时,按F10或F11键有时会进入机器码,请问这时除了停止调试外,还有没有其他方法返回到调试状态? 还有,就是在单步执行时,能不能返回到程序的上一行或上几行? 如果你认识还有哪些有用的调试技巧, A: 1.没有返回调试状态的说法 2.不能返回程序的上一行(你指的应该是程序的运行返回) 3. 如下: 推荐不错的VC调试入门 概述调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。 本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File 的子菜单Open。 设置为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是

Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。为了增加调试信息,可以按照下述步骤进行: ? 打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开) ? 选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括:命令行Project settings 说明无None 没有调试信息/Zd Line Numbers Only 目标文件或者可执行文件中只包含全局和导出符号以及代码行信息,不包含符号调试信息/Z7 C 7.0- Compatible 目标文件或者可执行文件中包含行号和所有符号调试信息,包括变量名及类型,函数及原型等/Zi Program Database 创建一个程序库(PDB),包括类型信息和符号调试信息。/ZI Program Database for Edit and Continue 除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效 ? 选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL ? 如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。断点断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。断点是最常用的技巧。调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。设置断点:可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上, 然后? 按F9快捷键? 弹出Breakpoints对话框,方法是按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints打开。打开后点击Break at编辑框的右侧的箭头,选择合适的位置信息。一般情况下,直接选择line xxx就足够了,如果想设置不是当前位置的断点,可以选择Advanced,然后填写函数、行号和可执行文件信息。

在Eclipse中使用debug(Eclipse调试常用技巧)

Eclipse调试常用技巧 发表时间:2010-04-06 最后修改:2010-11-26 记得刚刚毕业的时候,自己连断点也不会打,当时还在用JCreate,就连毕业设计也是用System.out找Bug的,想想真的很笨。开始工作后,一个星期过去了,在一个1、2百万行的系统中找Bug,我依然在用System.out,当时最痛苦的就是修改代码,每次找到疑似Bug,就输出一下,然后重启(那时也不知道代码热替换),直到有一天带我的导师发现了这样笨笨的调试Bug,才让我第一次认识了断点,也知道了代码修改完了可以进行热替换,我这个中国教育的半牺牲品才算向美好生活迈进了一小步。 1、条件断点 断点大家都比较熟悉,在Eclipse Java编辑区的行头双击就会得到一个断点,代码会运行到此处时停止。 条件断点,顾名思义就是一个有一定条件的断点,只有满足了用户设置的条件,代码才会在运行到断点处时停止。 在断点处点击鼠标右键,选择最后一个"Breakpoint Properties" 断点的属性界面及各个选项的意思如下图,

2、变量断点 断点不仅能打在语句上,变量也可以接受断点, 上图就是一个变量的打的断点,在变量的值初始化,或是变量值改变时可以停止,当然变量断点上也是可以加条件的,和上面的介绍的条件断点的设置是一样的。 3、方法断点 方法断点就是将断点打在方法的入口处, 方法断点的特别之处在于它可以打在JDK的源码里,由于JDK在编译时去掉了调试信息,所以普通断点是不能打到里面的,但是方法断点却可以,可以通过这种方法查看方法的调用栈。

4、改变变量值 代码停在了断点处,但是传过来的值不正确,如何修改一下变量值保证代码继续走正确的流程,或是说有一个异常分支老是进不去,能不能调试时改一下条件,看一下异常分支代码是否正确? 在Debug视图的Variables小窗口中,我们可以看到mDestJarName变量的值为" F:\Study\eclipsepro\JarDir\jarHelp.jar" 我们可以在变量上右键,选择"Change Value..."在弹出的对话框中修改变量的值, 或是在下面的值查看窗口中修改,保用Ctr+S保存后,变量值就会变成修改后的新值了。 5、重新调试 这种调试的回退不是万能的,只能在当前线程的栈帧中回退,也就说最多只能退回到当前线程的调用的开始处。 回退时,请在需要回退的线程方法上点右键,选择"Drop to Frame"

VC调试技巧

VC调试篇 难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。 我以前接触的程序大多是有比较成形的思路和方法,调试起来出的问题都比较小,最近这个是我自己慢慢摸索调试,接触了很多新的调试方法,并查了很多前辈的总结,受益匪浅,总结以前的和新的收获如下: VC调试篇 设置 为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。 为了增加调试信息,可以按照下述步骤进行: ?打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开) ?选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括: ?选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL ?如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。

调试方法: 1、使用 Assert(原则:尽量简单)assert只在debug下生效,release下不会被编译。 2、防御性的编程 3、使用Trace 4、用GetLastError来检测返回值,通过得到错误代码来分析错误原因 5、把错误信息记录到文件中 位置断点(Location Breakpoint) 大家最常用的断点是普通的位置断点,在源程序的某一行按F9就设置了一个位置断点。但对于很多问题,这种朴素的断点作用有限。譬如下面这段代码: void CForDebugDlg::OnOK() { for (int i = 0; i < 1000; i++) //A { int k = i * 10 - 2; //B SendTo(k); //C int tmp = DoSome(i); //D int j = i / tmp; //E } } 执行此函数,程序崩溃于E行,发现此时tmp为0,假设tmp本不应该为0,怎么这个时候为0呢?所以最好能够跟踪此次循环时DoSome函数是如何运行的,但由于是在循环体内,如果在E行设置断点,可能需要按F5(GO)许多次。这样手要不停的按,很痛苦。使用VC6断点修饰条件就可以轻易解决此问题。步骤如下。 1 Ctrl+B打开断点设置框,如下图:

C++编程中的四个调试小技巧

C++编程中的四个调试小技巧 1.调试标记 适用预处理#define定义一个或多个调试标记,在代码中把调试部分使用#ifdef 和#endif 进行管理。当程序最终调试完成后,只需要使用#undef标记,调试代码就会消失。常用的调试标记为DEBUG, 语句序列: #define DEBUG #ifdef DEBUG 调试代码 #endif 2.运行期间调试标记 在程序运行期间打开和关闭调试标记。通过设置一个调试bool标记可以实现。这对命令行运行的程序更为方便。 例如下面代码 #include<iostream> #include <string> using namespace std; bool debug =false; int main(int argc,char*argv[]) { for(int i=0;i<argc;i++) if(string(argv[i])=="--debug=on") debug = true; bool go=true; while(go) { if(debug) {

调试代码 }else {} } } 3.把变量和表达式转换成字符串 可是使用字符串运算符来实现转换输出定义 #define PR(x) cout<<#x"="<<x<<'\n' 4.c语言的assert() 该宏在<assert>中,,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言不为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止。 #include< assert> using namsapce std; int main() { int i=100; assert(i!=100); //Fails } 当调试完毕后在#include<assert>前加入#define NDEBUG即可消除红产生的代码 }

VC调试技术

VC调试技术 程序出错的类型大致可以分为两种,语法错误和逻辑错误。语法错误可以通过编译器的出错信息得到纠正。然而逻辑错误则不能,所以各大IDE(集成开发环境)中都提供了debug功能,用来分析和排除程序中的逻辑错误,排除逻辑错误的过程又称调试(或debug),下面谨以VC++6.0的调试环境做介绍。 常用的调试命令主要有: step into 命令快捷键:F11 单步执行每条语句,在遇到函数的时候,系统将进入函数,单步执行其中的语句。 step over 命令快捷键:F10 单步执行每条语句,但在遇到函数时候,系统将把函数当作“一条语句”来执行,自动执行其中的内容,而不进入函数内部单步执行。 run to cursor 命令快捷键:Ctrl+F10 系统将自动执行到用户光标所指的语句前。 (这个功能很有用,可以将精力集中到有问题的地方,从而节省调试时间) Go 命令快捷键:F5 系统将编译,连接,自动运行程序,但是会在程序设置了断点(breakpoint)处停下。BuildExcute 命令快捷键:Ctrl+F5 系统将编译,连接,运行编译好的程序代码,因此不会在断点处停留,但是在程序执行结束之后,系统会给一个Pause,以方便用户观察输出结果。 Stop debug命令快捷键:Shift+F5 本命令是用来终止动态调试过程的。 动态调试的主要方法——watch(监视变量) 在程序编译通过以后,当使用了step into,step over,run to cursor, go命令使系统在程序执行的过程中停下之后,系统就会进入调试状态。 调试过程中,你的程序执行窗口会调到后台,而系统窗口中会显示你的程序,其中的黄色箭头指向的是系统下一步将要执行的语句。 而系统窗口下面的那个监视窗口就是我们将要介绍的重点. watch窗口被左右分成了两个部分,左面的那部分我们姑且称之为“自动监视区”(即variable窗口),而右面的我们称之为“手动监视区”。(即watch窗口) 自动监视区是系统自动跟踪的变量名。 系统默认显示auto标签,那是显示在上一步执行过程中,程序中发生改变的变量。 locals标签跟踪的是某一个函数中的所有变量。 上面的find sourse组合框中指示的是当前在locals标签下在跟踪的变量是属于哪一个函数的。 说明:当find sourse组合框中的内容变成灰色时,说明系统正在运行程序,或者等待输入端的数据(通常会是这个情况),此时应当注意程序执行窗口中的内容。 然而通常仅仅只有自动监视区所监视的变量是不够的,有时我们需要自己定义一些需要跟踪的变量——这个时候我们就要在手动监视区中输入变量名(也可以是系统认为合法的表达式)来跟踪我们需要的值。 注意:当用户定义了一个指向数组的watch之后,在变量的左边会出现一个小的'+'号,表示这个数组可以“展开”——显示其中每一个下标所指示的内容,这与其他高级语言的IDE有些不同。 值得一提的是VC++的一个人性化设置:在用户定义的变量很多时,往往需要通过滚屏才能看到所

vc++6调试按钮用法和注意事项(考前资料)

调试详细教程 1、调试的一般过程 调试,就是在程序的运行过程的某一阶段观测程序的状态。在一般情况下程序是连续运行的,所以我们必须使程序在某一地点停下来。我们所做的第一项工作就是设立断点;其次再运行程序;当程序在设立断点处停下来时,利用各种工具观察程序的状态。 程序在断点停下来后,有时我们需要按我们的要求控制程序的运行,以进一步观测程序的流向。 下面我们依次来介绍断点的设置,如何控制程序的运行以及各种观察工具的利用。 3、设置断点 在VC中,可以设置多种类型的断点,根据断点起作用的方式把这些断点分为三类: 1、与位置有关的断点; 2、与逻辑条件有关的断点 3、与WINDOWS消息有关的断点。 主要介绍前面两种断点。 4、设置位置断点 最简单的是设置一般位置断点: ?把光标移到你要设断点的位置,当然这一行必须包含一条有效语句的; ?然后按工具条上的add/remove breakpoint 按钮或按快捷键F9。 将会在屏幕上看到在这一行的左边出现一个红色的圆点表示这里设立了一个断点

5、设置位置断点-图示 6、设置逻辑断点 有的时候可能不需要程序每次运行到这儿都停下来,而是在满足一定条件的情况下才停下来,这时就需要设置一种与位置有关的逻辑断点。 从EDIT 菜单中选中Breakpoints命令,这时Breakpoints对话框将会出现在屏幕上。选中Breakpoint对话框中的Location标签,使Location页面弹出。 如下页图所示。

7、 8、设置逻辑断点 单击上页Condition按钮,弹出Breakpoint Condition对话框,在expression_r编辑框中写出你的逻辑表达式,最后按OK返回。 这种断点主要是由其位置发生作用的,但也结合了逻辑条件,使之更灵活。 9、控制程序的运行 上面我们讲了如何设置各类断点,下面我们来介绍如何控制程序的运行。当我们从菜单Build到子菜单Start Debug选择Go,程序开始运行在Debug状态下,程序会由于断点而停顿下来后,可以看到有一个小箭头,它指向即将执行的代码。

VC调试方法大全

一、调试基础 调试快捷键 F5: 开始调试 Shift+F5: 停止调试 F10 : 调试到下一句,这里是单步跟踪 F11 : 调试到下一句,跟进函数内部 跟踪调试 1、尽量使用快捷键时行调试 2、观察调试信息 3、高级中断设置 异常调试 重试— > 取消— > 调试 函数堆栈,用variables 或者call stack 窗口 Release 调试 经常测试你的Debug 和Release 版本 不要移除调试代码,如用 ASSERT, TRACE 等。 初始化变量,特别是全局变量, malloc 的内存,new 的内存 当你移除某个资源时,确保你移除了所有跟这个资源相关的申明(主要是在 resouce.h 文中) 使用3或者4级的警告级编译你的代码,并确保没有警告, Project->setting->c/c++->warninglevel ( 版是项目-> 属性->C/C++-> 常规— > 警告等级) 6、—debug 改成 NDEBUG 进行调试,project->setting->C/C++->Preprocessordefinitions >属性->C/C++-> 预处理器-> 预处理定义)(这里是debug 和Release 编译的重要不同之一) VC 调试方法大全 VC 调试方法大全 Shift+F11: 从当前函数中跳出 Ctrl+F10: 调试到光标所在位置 F9: 设置(取消)断点 Alt+F9: 高级断点设置 中文 (中文版是项目-

7、在 Release 中调试源代码,project->setting->C/C++->debug info 选择ProgramDataBase (中文版是项 目-> 属性->C/C++-> 常规-> 调试信息格式-> 用于编辑并继续"的程序数据库),Project — >setting->link 选上 Generate debug info ( 中文版是项目-> 属性-> 链接器-> 调试-> 生成调试信息) 8、走读代码,特别关注堆栈和指针 二、TRACE 宏 当选择了 Debug 目标,并且afxTraceEnabled 变量被置为TRUE 时,TRACE 宏也就随之被激活了。但在程序的 Release 版本中,它们是被完全禁止的。下面是一个典型的 TRACE 语句: int nCount =9; CString strDesc("total"); TRACE("Count =%d,Descri ption =%s\n",nCount,strDesc); 可以看到,TRACE 语句的工作方式有点像C 语言中的printf 语句,TRACE 宏参数的个数是可变的,因此使用起来非 常容易。如果查看 MFC 的源代码,你根本找不到TRACE 宏,而只能看到TRACE0、TRACE1、TRACE2和 TRACE3宏,它们的参数分别为 0、1、2、3。 个人总结:最近看网络编程是碰到了 TRACE 语句,不知道在哪里输出,查了一晚上资料也没找出来,今天终于找到 了,方法如下: 1.在MFC 中加入TRACE 语句 2.在 TOOLS->MFCTRACER 中选择 “ ENABLE TRACING ”点击 OK 3.进行调试运行,G0(F5)(特别注意:不是执行!'以前之所以不能看到TRACE 内容,是因为不是调试执行,而是 !‘了,切记,切记) 口,在那里就看到TRACE 的内容了, 以下是找的TRACE 的详细介绍: TRACE 宏对于VC 下程序调试来说是很有用的东西,有着类似 出现,当RELEASE 的时候该宏就完全消失了,从而帮助你调式也在 使用非常简单,格式如下: TRACE("DDDDDDDDDDD"); TRACE("wewe%d",333); 4.然后就会在OUT PUT 中的DEBUG 窗口中看到TRACE 内容了, 调试执行会自动从 BUILD 窗口跳到DEBUG 窗 printf 的功能;该宏仅仅在程序的 DEBUG 版本中 RELEASE 的时候减少代码量。

投影设置小窍门-投影机最简单调试方法

投影设置小窍门-投影机最简单调试方法

投影设置小窍门投影机最简单调试方法 随着高清影音时代到来,包括大屏幕电视、显示器在内的显示产品持续热销,其中就连消费者以前很少接触的家用投影机也变得好卖了许多。不过,相比传统的家电产品,投影机无论在安装还是调试方面都要复杂不少。 作为一种精密的光学设备,投影机的使用方法与许多家电产品有所不同,在使用之中,有不少注意事项需要提前阅读。今天,小编主要介绍一些投影机菜单中的主要功能与调试方法,希望对于刚刚接触投影及的新手带来一些帮助。 画面颠倒怎么办?投影方式需设置正确 在日常使用中,投影机最常见的安装方式无外乎吊装与正投两种。但是,由于每款投影机的镜头规格不同,其产品在投影距离与投射角度上存在差异,因此在购买或安装投影机前,要根据说明书中的投射距离参数计算安装位置。 一些高端产品具备镜头位移功能 点击此处查看全部新闻图片

在一些中高端家用投影机中,用户可以通过镜头位移功能调整画面位置,而且画面质量不会降低。通过这一功能,投影机的安装范围大幅扩大,能够安置在沙发一旁的边桌或者专业器材架上,特别适合不便于吊装投影机的家庭。当然,这些具备位移功能的产品,售价要更贵一些。 投影方式确保设置正确 点击此处查看全部新闻图片 无论投影机采用吊装还是正投,首先要在菜单中选择相应的投影方式,才能获得方向正确的显示画面。否则,可能会出现画面颠倒的情况,此时调整投影方式即可解决。 画面变形咋办?尝试使用梯形校正功能 与安装显示器、平板电视相似,投影机同样不能放在不平稳的表面或架子上,最好能够水平放置,此时投影画面最清晰,且不会出现梯形畸变。如果需要向上投影时,投影机倾斜角度不应超过15度,否则将会影响投影机的使用寿命。

vc++6.0调试方法(附有快捷键)

调试程序可以帮助了解程序是怎样运行的。 1、如何快速地规范代码缩进格式 选中所需要规范的代码,按alt+F8 2、如何在Release状态下进行调试 Project->Setting…->Project Settings对话框,选择Release状态。“C/C++”标签页中的Category选General,Optimizations选Disable(Debug),Debug info选Program Database。在“Link”标签页中选中Generate debug info复选框。 注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。 3、Release和Debug有什么不同。 Release版称为发行版,Debug版称为调试版。 Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。 Release的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll),比如 MFC42.DLL。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C++ 6.0的机器上运行。而Debug版本的exe链接了调试版本的MFC DLL文件,如MFC42D.DLL。在没有安装Visual C++6.0的机器上不能运行,因为缺MFC42D.DLL等,除非选择use static dll when link。 4、ASSERT和VERIFY有什么区别 ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然编译,但不再判断真假。所以后者更安全一点。 例如ASSERT(file.Open(strFileName)),一旦到了Release版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。如果用VERIFY()就不会有这个问题。 5、Workspace和Project之间是什么样的关系 每个Workspace可以包括几个project,但只有一个处于Active状态,各个project之间可以有依赖关系,在project的S etting…中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。 6、如何在非MFC程序中使用ClassWizard 在工程目录下新建一个空的.RC文件,然后加入到工程中就可以了。

编译与调试技巧

调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。 这里我简要的根据自己的经验列出调试中比较常用的技巧,希望对大家有用。本文约定,在选择菜单时,通过/表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。 设置 为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。 为了增加调试信息,可以按照下述步骤进行: ?打开Project settings对话框(可以通过快捷键ALT+F7打开,也可以通过IDE菜单Project/Settings打开) ?选择C/C++页,Category中选择general ,则出现一个Debug Info下拉列表框,可供选择的调试信息方式包括: ? ?选择Link页,选中复选框"Generate Debug Info",这个选项将使连接器把调试信息写进可执行文件和DLL ?如果C/C++页中设置了Program Database以上的选项,则Link incrementally可以选择。选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。

断点是调试器设置的一个代码位置。当程序运行到断点时,程序中断执行,回到调试器。断点是最常用的技巧。调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。 设置断点:可以通过下述方法设置一个断点。首先把光标移动到需要设置断点的代码行上,然后 ?按F9快捷键 ?弹出Breakpoints对话框,方法是按快捷键CTRL+B或ALT+F9,或者通过菜单Edit/Breakpoints打开。打开后点击Break at编辑框的右侧的箭头,选择合适的位置信息。一般情况下,直接选择line xxx就足够了,如果 想设置不是当前位置的断点,可以选择Advanced,然后填写函数、行号 和可执行文件信息。 去掉断点:把光标移动到给定断点所在的行,再次按F9就可以取消断点。同前面所述,打开Breakpoints对话框后,也可以按照界面提示去掉断点。 条件断点:可以为断点设置一个条件,这样的断点称为条件断点。对于新加的断点,可以单击Conditions按钮,为断点设置一个表达式。当这个表达式发生改变时,程序就被中断。底下设置包括“观察数组或者结构的元素个数”,似乎可以设置一个指针所指向的内存区的大小,但是我设置一个比较的值但是改动范围之外的内存区似乎也导致断点起效。最后一个设置可以让程序先执行多少次然后才到达断点。 数据断点:数据断点只能在Breakpoints对话框中设置。选择“Data”页,就显示了设置数据断点的对话框。在编辑框中输入一个表达式,当这个表达式的值发生变化时,数据断点就到达。一般情况下,这个表达式应该由运算符和全局变量构成,例如:在编辑框中输入g_bFlag这个全局变量的名字,那么当程序中有g_bFlag= !g_bFlag时,程序就将停在这个语句处。 消息断点:VC也支持对Windows消息进行截获。他有两种方式进行截获:窗口消息处理函数和特定消息中断。 在Breakpoints对话框中选择Messages页,就可以设置消息断点。如果在上面那个对话框中写入消息处理函数的名字,那么每次消息被这个函数处理,断点就到达(我觉得如果采用普通断点在这个函数中截获,效果应该一样)。如果在底下的下拉列表框选择一个消息,则每次这种消息到达,程序就中断。 值

相关主题