Visual C++开发工具与调试技巧整理

 

Visual C++ 开发工具与调试技巧整理
自己总是用 VC 平台来开发东西,但是有时候总是出这样那样的问题,呵呵,总是需要上网查资料来解决 , 在这里把自己用到上网查的一些技巧摘录如下 , 希望对大家有用,省去大家再去搜索的烦恼。
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 。例如,如果在 C++ 源文件了内声明了一变量 “var1” ,却试图在另一个文件内以变量 “var1” 访问改变量。
(2) 如果使用的内联函数是在 .cpp 文件内定义的,而不是在头文件内定义将导致 LNK2001 错误。
(3) 调用函数时如果所用的参数类型和头函数声明时的类型不符将会产生 LNK2001 错误。
(4) 试图从基类的构造函数或析构函数中调用虚拟函数时将会导致 LNK2001 错误。
(5) 要注意函数和变量的可公用性,只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部方位任何没有在该文件内声明的静态变量时将导致编译错误或 LNK2001 错误。
<2> 由于编译和联机的设置而造成的 LNK2001 错误
(1) 如果编译时使用的是 /NOD(/NODERAULTLIB) 选项,程序所需要的运行库和 MFC 时将得到又编译器写入目标文件模块,但除非在文件中明确包含这些库名,否则这些库不会被链接进工程文件。这种情况下使用 /NOD 将导致 LNK2001 错误
(2) 如果没有为 wWinMainCRTStartup 设定程序入口,在使用 Unicode MFC 时将出现 “unresolved external on _WinMain@16” LNK2001 错误信息。
(3) 使用 /MD 选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对 “func” 的引用,在目标文件里即对 “__imp__func” 的引用。如果试图使用静态库 LIBC.LIB LIBCMT.LIB 进行链接,将在 __imp__func 上发生 LNK2001 错误。如果不使用 /MD 选项编译,在使用 MSVCxx.LIB 链接时也会发生 LNK2001 错误。
(4) 使用 /ML 选项编译时,如用 LIBCMT.LIB 链接会在 _errno 上发生 LNK2001 错误。
(5) 当编译调试版的应用程序时,如果采用发行版模态库进行链接也会产生 LNK2001 错误;同样,使用调试版模态库链接发行版应用程序时也会产生相同的错误。
(6) 不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说明。
(7) 在不同的模块中使用内联和非内联的编译选项能够导致 LNK2001 错误。如果创建 C++ 库时打开了函数内联 (/Ob1 /Ob2) ,但是在描述该函数的相应头文件里却关闭了函数内联 ( 没有 inline 关键字 ) ,只是将得到错误信息。为避免该问题的发生,应该在相应的头文件中用 inline 关键字标志为内联函数。
(8) 不正确的 /SUBSYSTEM ENTRY 设置也能导致 LNK2001 错误。
19. 如何调试一个没有源码的 exe 文件调用的 dll
Visual C++ 6.0 中,进入 “Project Setting” 对话框然后选择 Debug 标签页。通常 Visual Studio 默认 “executable for debug session” 为可执行文件名,但可以将他改成任何你想要的程序。甚至可以指定不同的工作目录以及传递参数到你的程序。这个技术常用来调试 Dlls 、名字空间扩展、 COM 对象和其他从某些 EXE 以及从第三方的 EXE 中调用的 plug-in 程序。
20.   Visual C++ 6.0 工程中的项目文件都表示什么
.opt :工程关于开发环境的参数文件。如工具条位置等信息。
.aps(AppStudio File) 资源辅助文件,二进制格式,一般不用去管它。
.clw ClassWizard 信息文件,实际上是 INI 文件格式,有兴趣可以研究一下。有时候 ClassWizard 出了问题,手工修改 CLW 文件可以解决。如果此文件不存在的话,每次用 ClassWizard 的时候回提示是否重建。
.dsp(DevelopStudio Project) :项目文件,文本格式,不过不熟悉的不要手工修改。
.dsw(DevelopStudio Workspace) :是工作区文件,其他特点和 .dsp 差不多。
.plg :是编译信息文件,编译时的 error warning 信息文件 ( 实际上是一个 html 文件 ) ,一般用处不大。在单击菜单【 Tool 】- > Option 】弹出的对话框里面有个选项可以控制这个文件的生成。
.hpj(Help Project) :是生成帮助文件的工程,用 microsoft Help Compiler 可以处理。
.mdp(Microsoft DevStudio Project) :是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的 .dsp 格式。
.bsc :是用于浏览项目信息的,如果用 Source Brower 的话就必须有这个文件。如果不用这个功能的话,可以在 Project Options 里面去掉 Generate Browse Info File ,这样可以加快编译速度。
.map 是执行文件的映象信息记录文件,除非对系统底层,这个文件一般用不着。
.pch(Pre-Compiled File) :是与编译文件,可以加快编译速度,但是文件非常大。
.pdb(Program Database) :记录了程序有关的一些数据和调试信息,在调试的时候可能有用。
.exp :只有在编译 DLL 的时候才会生成,记录了 DLL 文件的一些信息,一般也没有用。
.ncb :无编译浏览文件 (no compile browser) 。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。
 
 

 

  • 0
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值