热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

VC调试常用方法集

1.如何在Release状态下进行调试Project-SettingProjectSetting对话框,选择Release状态。CC标签中的Category选Ge

1.如何在Release状态下进行调试

  Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program Database。在Link标签中选中Generate debug info复选框。

  注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。

  2. Release和Debug有什么不同

  Release版称为发行版,Debug版称为调试版。

  Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。

  Release的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll)。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C++ 6.0的机器上运行。而Debug版本的exe链接了调试版本的MFC DLL文件,在没有安装Visual C++6.0的机器上不能运行,因为缺相应的DLL,除非选择use static dll when link。

  3. ASSERT和VERIFY有什么区别

  ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然翻译,但不再判断真假。所以后者更安全一点。

  例如ASSERT(file.Open(strFileName))。

  一旦到了Release版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。如果用VERIFY()就不会有这个问题。

  4.Workspace和Project之间是什么样的关系

  每个Workspace可以包括几个project,但只有一个处于Active状态,各个project之间可以有依赖关系,在project的Setting..中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。

  5. 如何在非MFC程序中使用ClassWizard

  在工程目录下新建一个空的.RC文件,然后加入到工程中就可以了。

  6.如何设置断点

  按F9在当前光标处增加一个断点和取消一个断点。

  另外,在编辑状态下,按Ctrl+B组合键,弹出断点设置对话框。然后单击【Condition…】按钮弹出设置断点条件的对话框进行设置。

  7.在编辑状态下发现成员变量或函数不能显示提示是如何打开显示功能

  这似乎是目前这个Visual C++ 6.0版本的一个bug,可按如下步骤使其正常,如再出现,可如法炮制:

  (1)关闭Project

  (2)删除“工程名.ncb”文件

  (3)重新打开工程

  8.如何将一个通过ClassWizard生成的类彻底删除

  首先在工作区的FileView中选中该类的.h和.cpp文件,按delete删除,然后在文件管理器中将这两个文件删除,再运行ClassWizard,这时出现是否移走该类的提示,选择remove就可以了。

  9. 如何将在workspace中消失的类找出来

  打开该类对应的头文件,然后将其类名随便改一下,这个时候工作区就会出现新的类,再将这个类改回原来的名字就可以了。

  10. 如何清除所有的断点

  菜单【Edit】->【Breakpoints…】,打开“Breakpoints”对话框,单击【Remove All】按钮即可。快捷键是“Ctrl + Shift + F8”。

  11. 如何再ClassWizard中选择未列出的信息

  打开“ClassWizard”对话框,然后切换到“Class Info”页面。改变“Message filter”,如选择“Window”,“Message”页面就会出现Window的信息。

  12. 如何检测程序中的括号是否匹配

  把光标移动到需要检测的括号前面,按快捷键“Ctrl + ]”。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告。

  13. 如何查看一个宏(或变量、函数)的定义

  把光标移动到要查看的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的相关菜单),如果没有建立浏览文件,就会出现提示对话框,按【确定】按钮,然后就会跳到该宏(或变量、函数)定义的地方。

  14. 如何添加Lib文件到当前工程

  单击菜单【Project】->【Settings…】弹出“Project Setting”对话框,切换到“Link”标签页,在“Object/library modules”处输入Lib文件名称,不同的Lib之间用空格格开。

  15. 如何快速删除项目下的Debug文件夹中临时文件

  在工作区的FileView视图中选中对应的项目,单击右键弹出菜单,选择【Clean(selection only)】菜单即可。

  16. 如何快速生成一个现有工程除了工程名外完全相同的新工程

  在新建工程的“New”对话框中选择“Custom Appwizard”项,输入新工程的名字,单击【OK】按钮。出现“Custom AppWizard”项,输入新工程的名字,单击【OK】按钮。出现“Custom AppWizard-Step 1 of 2”对话框,选择“An existing Project”项,单击【Next】按钮。出现“Custom AppWizard-Step 2 of 2”对话框,选择现有工程的工程文件名,最后单击【Finish】按钮。编译后就生成一个与现有工程相同但可以重新取名的工程AppWizard。

  现在就可以项用MFC AppWizard一样用这个定制的向导。如果不想用了,可以在Visual C++ 6.0安装目录下Common/MSDev98/Template目录中删除该Wizard对应的.awx和.pdb文件。

  17. 如何解决Visual C++ 6.0不正确连接的问题

  情景:明明改动了一个文件,却要把整个项目全部重新编译链接一次。刚刚链接好,一运行,又提示重新编译链接一次。

  这是因为出现了未来文件(修改时间和创建时间比系统时间晚)的缘故。可以这样处理:找到工程文件夹下的debug目录,将创建和修改时间都比系统时间的文件全部删除,然后再从新“Rebuild All”一次。

  18. 引起LNK2001的常见错误都有哪些

  遇到的LNK2001错误主要为:unresolved external symbol “symbol”

  如果链接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误信息。

一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在,拼写不正确或者使用错误;其次可能使用了不同版本的链接库。以下是可能产生LNK2001错误的原因:

  <1>由于编码错误导致的LNK2001错误

  (1)不相匹配的程序代码或模块定义(.DEF)文件导致LNK2001。例如&#xff0c;如果在C&#43;&#43;源文件了内声明了一变量“var1”&#xff0c;却试图在另一个文件内以变量“var1”访问改变量。

  (2)如果使用的内联函数是在.cpp文件内定义的&#xff0c;而不是在头文件内定义将导致LNK2001错误。

  (3)调用函数时如果所用的参数类型和头函数声明时的类型不符将会产生LNK2001错误。

  (4)试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001错误。

  (5)要注意函数和变量的可公用性&#xff0c;只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部方位任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001错误。

  <2>由于编译和联机的设置而造成的LNK2001错误

  (1)如果编译时使用的是/NOD(/NODERAULTLIB)选项&#xff0c;程序所需要的运行库和MFC时将得到又编译器写入目标文件模块&#xff0c;但除非在文件中明确包含这些库名&#xff0c;否则这些库不会被链接进工程文件。这种情况下使用/NOD将导致LNK2001错误

  (2)如果没有为wWinMainCRTStartup设定程序入口&#xff0c;在使用Unicode和MFC时将出现“unresolved external on _WinMain&#64;16”的LNK2001错误信息。

  (3)使用/MD选项编译时&#xff0c;既然所有的运行库都被保留在动态链接库之内&#xff0c;源文件中对“func”的引用&#xff0c;在目标文件里即对“__imp__func”的引用。如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行链接&#xff0c;将在__imp__func上发生LNK2001错误。如果不使用/MD选项编译&#xff0c;在使用MSVCxx.LIB链接时也会发生LNK2001错误。

  (4)使用/ML选项编译时&#xff0c;如用LIBCMT.LIB链接会在_errno上发生LNK2001错误。

  (5)当编译调试版的应用程序时&#xff0c;如果采用发行版模态库进行链接也会产生LNK2001错误;同样&#xff0c;使用调试版模态库链接发行版应用程序时也会产生相同的错误。

  (6)不同版本的库和编译器的混合使用也能产生问题&#xff0c;因为新版的库里可能包含早先的版本没有的符号和说明。

  (7)在不同的模块中使用内联和非内联的编译选项能够导致LNK2001错误。如果创建C&#43;&#43;库时打开了函数内联(/Ob1或/Ob2)&#xff0c;但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字)&#xff0c;只是将得到错误信息。为避免该问题的发生&#xff0c;应该在相应的头文件中用inline关键字标志为内联函数。

  (8)不正确的/SUBSYSTEM或ENTRY设置也能导致LNK2001错误。

  19. 如何调试一个没有源码的exe文件调用的dll

  在Visual C&#43;&#43; 6.0中&#xff0c;进入“Project Setting”对话框然后选择Debug标签页。通常Visual Studio默认“executable for debug session”为可执行文件名&#xff0c;但可以将他改成任何你想要的程序。甚至可以指定不同的工作目录以及传递参数到你的程序。这个技术常用来调试Dlls、名字空间扩展、COM对象和其他从某些EXE以及从第三方的EXE中调用的plug-in程序。

  20. Visual C&#43;&#43; 6.0工程中的项目文件都表示什么

  .opt&#xff1a;工程关于开发环境的参数文件。如工具条位置等信息。

  .aps(AppStudio File)资源辅助文件&#xff0c;二进制格式&#xff0c;一般不用去管它。

  .clw&#xff1a;ClassWizard信息文件&#xff0c;实际上是INI文件格式&#xff0c;有兴趣可以研究一下。有时候ClassWizard出了问题&#xff0c;手工修改CLW文件可以解决。如果此文件不存在的话&#xff0c;每次用ClassWizard的时候回提示是否重建。

  .dsp(DevelopStudio Project)&#xff1a;项目文件&#xff0c;文本格式&#xff0c;不过不熟悉的不要手工修改。

  .dsw(DevelopStudio Workspace)&#xff1a;是工作区文件&#xff0c;其他特点和.dsp差不多。

  .plg&#xff1a;是编译信息文件&#xff0c;编译时的error和warning信息文件(实际上是一个html文件)&#xff0c;一般用处不大。在单击菜单【Tool】->【Option】弹出的对话框里面有个选项可以控制这个文件的生成。

  .hpj(Help Project)&#xff1a;是生成帮助文件的工程&#xff0c;用microsoft Help Compiler可以处理。

  .mdp(Microsoft DevStudio Project)&#xff1a;是旧版本的项目文件&#xff0c;如果要打开此文件的话&#xff0c;会提示你是否转换成新的.dsp格式。

  .bsc&#xff1a;是用于浏览项目信息的&#xff0c;如果用Source Brower的话就必须有这个文件。如果不用这个功能的话&#xff0c;可以在Project Options里面去掉Generate Browse Info File&#xff0c;这样可以加快编译速度。

  .map是执行文件的映象信息记录文件&#xff0c;除非对系统底层&#xff0c;这个文件一般用不着。

  .pch(Pre-Compiled File)&#xff1a;是与编译文件&#xff0c;可以加快编译速度&#xff0c;但是文件非常大。

  .pdb(Program Database)&#xff1a;记录了程序有关的一些数据和调试信息&#xff0c;在调试的时候可能有用。

  .exp&#xff1a;只有在编译DLL的时候才会生成&#xff0c;记录了DLL文件的一些信息&#xff0c;一般也没有用。

  .ncb&#xff1a;无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • WPF开发心率检测大数据曲线图的高性能实现方法
    本文介绍了在WPF开发中实现心率检测大数据曲线图的高性能方法。作者尝试过使用Canvas和第三方开源库,但性能和功能都不理想。最终作者选择使用DrawingVisual对象,并结合局部显示的方式实现了自己想要的效果。文章详细介绍了实现思路和具体代码,对于不熟悉DrawingVisual的读者可以去微软官网了解更多细节。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • 本文介绍了如何使用PHP代码将表格导出为UTF8格式的Excel文件。首先,需要连接到数据库并获取表格的列名。然后,设置文件名和文件指针,并将内容写入文件。最后,设置响应头部,将文件作为附件下载。 ... [详细]
author-avatar
良缘喜铺-小虹
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有