搜档网
当前位置:搜档网 › VC++调试技巧

VC++调试技巧

1.没有解决的外部定义错误xyView.obj : error LNK2001: unresolved external symbol "public: __thiscall CMyOCRInfo::CMyOCRInfo(void)" (??0CMyOCRInfo@@QAE@XZ)可能是由于构造方法没有实现代码
2.没有释放 HBITMAP 句柄造成不能创建位图的问题2004.8.17没有及时的释放 HBITMAP 句柄,当创建位图数达到 30 时,出现 8 号错误,即内存不足
3.在调试窗口输出信息TRACE(s)
;4.如果用向导新建类时只有自定义类型,则可能是因为 .clw 文件没有生成,生成该文件即可
5.要注意变量的类型范围,强制转换可能会导致数据溢出;下面的示例将导致死循环:for(byte i=0;i<256;i++){ ... ...}注:由于 byte 类型的表示范围为:0-255 ,因此 i 永远不可能大于 255 ,所以导致死锁
6.没有包含 stdafx.h 导致的错误:fatal error C1010: unexpected end of file while looking for divcompiled header directive在 .cpp 文件中包含 stdafx.h 文件即可
7.避免重复包含头文件#ifndef _INC_PUBLIC_H_32564987132178947#define _INC_PUBLIC_H_32564987132178947// 中间写代码...#endif注:#ifndef 可以改为 #if !defined
8.出现重复定义错误,例如:d:\program files\microsoft visual studio\vc98\include\dbdaoint.h(33) : error C2011: 'EditModeEnum' : 'enum' type redefinition先检查所有的 .h 文件中是否定义了 include "stdafx.h" ,删之再在所有的 .cpp 文件中搜索 stdafx ,看是否重复包含了 stdafx.h 文件,把重复的删掉又如:RefImageDll.obj : error LNK2005: "int __cdecl GetCameraRefImageIndexOfID1(class CArray<class CCameraRefImage,class CCameraRefImage> &,int)" (?GetCameraRefImageIndexOfID1@@YAHAAV?$CArray@VCCameraRefImage@@V1@@@H@Z) already defined in InterFaceFile.obj是因为在 .h 文件中定义了一个函数,且做了完整的实现,因此被多个文件包含时就会出现重复定义错误,解决的方法是把该函数定义成 inline ,这样就不再是一个函数而直接采用一段代码替换了,如:int inline GetAge(){ return 10;}
9.类定义不完整,例如:refimagedll.h(14) : error C2236: unexpected 'class' 'CRefImageListDll'一般是因为在该文件包含的文件中存在类定义不完整,例如:calss a{ int age;}后面少了一个分号,应该改成:class a{ int age;};
10.纯虚类不能生成实例,例如:d:\program files\microsoft visual studio\vc98\mfc\include\afxtempl.h(201) : error C2259: 'CKernel' : cannot instantiate abstract class due to following members:如下:class a{public: virtual void SetValue(int i)=NULL;}class b : public a{private: int m_iID;public:}这样的话,B 也不能实例化,因为在 B 中没有实现 SetValue() 方法,在 B 中实现 SetValue() 方法即可解决。

正在装载数据……

11.重复释放导致

的问题User breakpoint called from code at 0x77f9193c 以上原因是由于释放了一个类的成员,最后在作该类的析构时由于它的成员已经被释放导致出错(该成员被释放但是没有设 NULL)
12.试图执行系统不支持的操作请检查当前窗口模块是否使用了其他不属于它自己的资源
13.在 Dll 里调用对话框等资源的方法(如何在动态链接库中显示对话框) 2006.7.24在动态链接库的显示对话框函数中加入下面这句代码即可:AFX_MANAGE_STATE(AfxGetStaticModuleState());如果需要导出对话框的对象,在外面进行显示,则可以重载 DoModal() 方法,在该方法中加入 AFX_MANAGE_STATE(AfxGetStaticModuleState());
14.动态链接库和静态链接库混用的问题症状:使用 LoadLibrary() 加载一个动态链接库时,返回 0 ,函数不成功,调用 GetLastError() 返回结果 126 ,MSDN 如是说:126 The specified module could not be found. ERROR_MOD_NOT_FOUND 经研究发现,是因为该动态链接库采用了静态的方式调用了另一个链接库(B),而另一个链接库则又采用静态的方式调用了另一个动态链接库(C),但是 C 却没有拷贝到程序所在目录,所以导致不能正常加载
15.宏定义导致系统出错连出三个错误:ignored on left of 'unsigned char' when no variable is declarederror C2143: syntax error : missing ';' before 'constant'error C2106: '=' : left operand must be l-value代码如下: byte R=(byte)(AColor & 0xFF);如果按照常理,应该不会有问题,但是由于一个函数库里面对 R 有定义,所以 R 便不能当做变量使用
16.Debug 版本的 GetDocument() 函数可用,而 Release 版本则不能使用,提示函数没有实现代码检查 .h 文件中最后是否函数如下代码:#ifndef _DEBUG // debug version in LCDModelView.cppinline CXXXDoc* CXXXView::GetDocument(){ return (CXXXDoc*)m_pDocument; }#endif原理:对于从来都没有调用的函数,可以没有其实现代码,如果含有有一处调用则一定要有其实现代码,微软采用宏定义来区分 Release 和 Debug 版本。
17.VC 环境下不能使用 FindFile 进行文件搜索的问题(刘栋嫣发现,陆宽解决 2007.3.1)在 VC 的集成开发环境下,点击搜索文件按钮,VC 崩溃检查注册表键:HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\SearchOld\FIF_InFolders发现其值为一个不存在的目录,导致崩溃,解决办法是清除该键值即可



相关主题