vs2005调试技巧
- 格式:doc
- 大小:348.50 KB
- 文档页数:7
VS2005下的64位编程与移植VS2005下的64位编程与移植Mar 18th, 2012 | Comments最近有个项目需要将32位下的代码移植到64位下,之前没有做过这方面的工作,特别向同事请教了这方面的知识,在此记录下来。
VS2005下64位编程环境1.VS2005安装时要勾选X64 Compilers and Tools,如果安装时忘记了,则可以重新打开VS2005安装程序来添加;2.VS2005X64编程环境设置3.在VS2005的Build菜单下选择Configuration Management;4.在Configuration Management对话框中的Active solution platform下选择New;5.在New Solution Platform中的Type or select the new platform下选择x64,OK。
对于没有汇编的程序,上述设置就可以了。
但如果代码中有汇编代码,则还需要Project下的Custom Build Rules中切换到MASM64 Bulid Rule。
缺省情况下,VS2005没有提供到MASM64 Bulid Rule,需要将原来的masm.rules(在C:\Program Files\Microsoft Visual Studio 8\VC\VCProjectDefaults文件夹下)文件拷贝一份,重新命名为masm64.rules,并在VS2005中修改rule中的ml.exe为ml64.exe 即可。
上面设置好之后,就可以在Win32和X64平台间自由切换,但要注意的是,切换的时候也需要将Custom Build Rules切换到相应的平台下。
VS2005下64位编程的注意事项•X64平台下,不支持内联汇编,必须将汇编代码提取到独立的.asm文件中去;•指针不再是32位,而是64位,汇编代码中涉及32位寄存器间接寻址的,移植时需要修改;•32位的寄存器被扩展为64位,又增加了一些新的寄存器;•函数参数的传递与32位下汇编不再相同,而是前4个参数分别通过RCX, RDX, R8, R9来传递,其他的参数通过堆栈来传递;上述的应该是最基本的,要在64位平台中进行编程,还需要了解更多的这方面的知识。
一准备DDK版本:Windows DDK 3790IDE:Visual Studio 2005二用DDK环境编译驱动这种编译驱动的办法是DDK文档中所提倡的办法。
此种方法需要编写一个编译脚本文件,在这个脚本中描述了DDK驱动程序的源文件、用到的lib文件和include路径名、编译输出的目录和文件名等信息。
编写此类脚本对于Windows程序员可能比较陌生,尤其是当源文件较多时,编写脚本文件可能显得更如麻烦。
在源程序的相同目录下创建两个文件makefile和Sources,这两个文件都是文本文件,内容如下。
Makefile这个文件不要修改## DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source# file to this component. This file merely indirects to the real make file# that is shared by all the driver components of the Windows NT DDK#!INCLUDE $(NTMAKEENV)\makefile.defSources这个文件参考实际情况修改!if "$(DDK_TARGET_OS)"=="Win2K"TARGETNAME=Passthru_2000!elseif "$(DDK_TARGET_OS)"=="WinXP"TARGETNAME= Passthru _XP!elseif "$(DDK_TARGET_OS)"=="WinNET"TARGETNAME= Passthru _03Server!endifTARGETPATH=objTARGETTYPE=DRIVERC_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1!if !defined(DDK_TARGET_OS) || "$(DDK_TARGET_OS)"=="Win2K"## The driver is built in the Win2K build environment#C_DEFINES=$(C_DEFINES) -DNDIS40_MINIPORT=1C_DEFINES=$(C_DEFINES) -DNDIS40=1!else## The driver is built in the XP or .NET build environment# So let us build NDIS 5.1 version.#C_DEFINES=$(C_DEFINES) -DNDIS51_MINIPORT=1C_DEFINES=$(C_DEFINES) -DNDIS51=1!endif# Uncomment the following to build for Win98/SE/WinMe# This causes several APIs that are not present in Win9X to be# ifdef'ed out.# C_DEFINES=$(C_DEFINES) -DWIN9X=1PRECOMPILED_INCLUDE=precomp.hPRECOMPILED_PCH=precomp.pchPRECOMPILED_OBJ=precomp.obj!if !defined(DDK_TARGET_OS) || "$(DDK_TARGET_OS)"=="Win2K"TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib \$(DDK_LIB_PATH)\ntstrsafe.lib!elseTARGETLIBS=$(DDK_LIB_PATH)\ndis.lib!endifUSE_MAPSYM=1INCLUDES=SOURCES=\miniport.c \passthru.c \passthru.rc \protocol.c \PTEXTEND.C \filter.c前7行说明此驱动的名称,这里用到了宏来控制不同操作系统版本的编译所需的文件,$(DDK_TARGET_OS)是从外面的命令行传递进来的。
vs2005的初步使用今天安装了VS2005,也在网上查了一下,很乱,我就帮大家整理下,大家看下,基本的使用会没有什么问题的!不得不说VS2005很强大,但如何使用?这点很重要……呵呵!首先,我不知道什么创建WIN32控制台程序和WIN32应用程序。
感觉有点痛苦。
这里教下如何创建WIN32控制台程序和如果创建WIN32应用程序。
先说WIN32控制台程序1:文件 -> 新建 -> 项目2:“输入名称"是输入工程的名称,不必要加上后缀。
按“确定”后会出现如下图:但不要选择“完成”而是要选择“下一步”。
然后如下图:这里要选择“空项目”,应该说最好是选择“空项目”。
最后按“完成”。
这时候在“解决方案”上看到源文件,如下图:右击“源文件”后选择“添加”-> “新建项”。
然后弹出一个对话框,如下图:照上去的选择,然后输入文件名。
这个文件名就要加上后缀了。
想写C程序就加上C后缀,写C++程序后缀加不加都行,默认是.cpp后缀。
最后就把传说中的程序写上去。
就是HELLO WORLD程序。
然后运行,可报出无法找到msvcr80d.dll文件。
这时候只能去GOOGLE了。
下载一个msvcr80d.dll文件放到C:\WINDOW\SYSTEM32\目录下。
下载msvcr80d.dll文件后,要想运行程序,就按 工具 -> 开始执行(不调试),也就是Ctrl + F5。
OK,最后输出。
如下图:大家有没有发现最左边“源文件”那里虽然后缀是.C。
但它们的图片还是C++。
对于这点不要觉得奇怪。
以前在群里听人聊起的时候听说过,没什么大不了的事。
现在我也不记得了。
最后,OK,一个在VS2005下的WIN32程序运行完毕。
完毕是完毕了。
可大家有没有发觉我的代码比你们的漂亮多了。
主要是我下载了VS2005助手。
VS2005里有智能,但我不知道什么设置。
最后我去下载个和VC6一样的小助手。
只不过用在VS2005中。
※SDK的可下载地址:/source/1846785/source/18468123.连接activesync开始操作连接activesync时,做了以下操作:(1)wince模拟器配置1. 当WinCE在模拟器中运行以后,选择Start->Settings->Control Panel,如图:2. 在弹出的控制面板对话框中选择Network and Dail-up Connections,然后双击Make New Co nnection,在连接类型中选择Direct Connection,如图:3. 选择Next,然后选择Serial Over DMA,如图:4. 最后选择Finish就创建了一个新的连接。
创建完成后,重新回到控制面板界面选择PC Conn ection,在弹出界面中选择Change,然后选择刚刚添加的My Connection,如图:5. 完成后点击OK按钮,然后关闭控制面板,现在模拟器设备已经配置好了。
(2)activesync配置安装ActiveSync并运行,在菜单中选择File,然后选择Connect Settings,按照下图进行设置:设置完后,再通过vs2005中,tools-> device emulator manager这时弹出一个Device Emulator Manager的对话框,展开Datastore,选择想要连接的平台,然后右键,选择connect,等一会就会出现模拟器,这时刚刚选中项前有个绿色小箭头,右键,选择Cradle ,这时会连接activesync。
如果activesync无法连接上。
可以尝试以下方法:1、按照下图操作,把之前的保存状态清除2、删除C:\Documents and Settings\xxx\Local Settings\Application Data\Microsof t\CoreCon\1.0里边的内容(删除前先备份一下,不行再恢复)。
Visual Studio 开发简单COM控件,以及调用1开发COM控件下面例子的开发过程是使用VS2005,VS2008类似。
1.1创建COM工程创建COM工程的过程如下:首先,创建COM工程,选择“ATL”的“ATL项目”。
这里的工程名称为“ComTest”。
接着,出现“欢迎使用ATL项目向导”,直接点击“下一步”即可。
然后,出现“应用程序设置”,默认设置即可。
创建工程以后,会自动产生比较多的文件,宝卡的文件如下。
1.2添加对象右键点击“ComTest”工程添加类,如下图所示。
添加“ATL简单对象”即可。
填写类的名称,这里填写的简称为TestObject,这个在后面的应用中,会作为对象的名称。
点击“下一步”。
选择“ATL简单对象”属性,这里可以把“ISupportErrorInfo”和“IObjectWithSite”,在这个测试工程没有使用到。
点击“完成”。
在添加对象“TestObject”之后,工程会自动产生文件“TestObject.h”和“TestObject.cpp”,另外,文件“ComTest.idl”会更改,把TestObject相关的对象信息写入。
1.3添加源代码1.3.1更改TestObject.h这个头文件的源代码如下:// TestObject.h : CTestObject 的声明#pragma once#include"resource.h"// 主符号#include"atlctl.h"#include"ComTest.h"#if defined(_WIN32_WCE) && !defined(_CE_DCOM)&& !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)#error "Windows CE 平台(如不提供完全DCOM 支持的Windows Mobile 平台)上无法正确支持单线程COM 对象。
CAA+RADE+VS安装及环境配置本教程旨在为广大CATIA二次开发初学者提供入门级别的学习,在学习本教程之前,需要自行下载catia安装软件、visual studio 2005软件、CAA、RADE以及catia破解程序和RADE 破解程序.作为一名数字化制造技术的研究者,我与大多数学子一样是一名刚从本科毕业,现在进入研究生阶段的学习.在接触新事物之前,尤其对于程序开发人员,专业软件的安装以及环境的配置给大多数学子带来了许多不必要的麻烦,恰好这种麻烦也是我们提升自身能力的重要阶段.经过近三个月的摸索,对CATIA二次开发从认识到实践、从陌生到熟悉,现将本阶段的学习过程及其中遇到的困难解答分享给广大读者,希望大家对其中的错误以及不足提出宝贵的意见(发送邮件至yyj0910@).谢谢!首先,我们进行的是软件的安装及配置:一、安装Microsoft visual studio 2005(以下简称vs2005)1.vs2005包含了vb、.net、c#、c++.这里.net、c#、c++为必须安装项.2.需要安装MSDN帮助文档.二、安装CATIA V5R19 ([达索CATIA.v5R19.SP0.Dassault.Systemes].Catia.v5.r19.iso)1.安装虚拟光驱DAEMON Tools Lite(安装目录任意)2.使用虚拟光驱打开.iso文件,安装catia.(注意:安装目录为本地盘符的根目录,如D:\catia_v5r19.)此时还不能打开CATIA,需要执行完破解文件之后才能打开(具体参考下一步).选择下一步选择下一步新建目标文件夹位于盘符根目录下目录不存在,选择新建点是输入标识,按照上面要求输入即可环境目录默认,选择下一步环境目录不存在,新建选择是选择完全安装,选择下一步默认不用更改,选择下一步默认不用更改,选择下一步选择下一步按照需要设置,选择下一步不安装联机文档,选择下一步选择安装,完成3.把破解文件(catia_v5r19sp0_x32_crk.exe)复制到D:\catia_v5r19\intel_a\code\bin下,执行.选择Start三、安装CAA1.点击下一步2.CAA的安装目录选择catia的安装目录里3.选择完全安装4.点击安装5.提示插入第二张盘,将CAA第二张光盘映像文件载入虚拟光驱,然后点击确定6.完成界面最后,把include.rar解压到 d:\catia_v5r19.四、安装RADE1.点击下一步2.建立RADE的安装目录为盘符的根目录,与CATIA的目录平级,若提示找不到文件夹,则选择新建,然后点击下一步3.输入标识,按照要求输入即可4.选择环境目录为默认的目录,点击下一步,若提示没有目录,则选择新建5.选择完全安装,点击下一步6.默认,直接下一步7.点击安装8.完成。
一、工作组成员设置VsiualStudio2005
[工具-选项-源代码管理],选择源代码管理插件Microsoft Visual SourceSafe[局域网中应用不用选择Internet],在“环境”中选中"打开solution时获取最新的源代码","关闭solution时嵌入所有代码。
二、工作守则
以下列出了各成员必须遵守的规范和规则:
1.工作开始初次打开project时必须向服务器请求最新代码.
2. 当向project添加新项或编辑任何程序代码后,应立即check in project.以便其他成员可操作该project.
3.不允许check out整个目录. 不允许长时间check out project或solution.并且除非特别必要.不应同时check out过多的项.
4.某工作步骤完成后,应Build整个project以检验当前工作.严禁不经过build而check in可能不通过的代码.
最后小提下,以我的经验来看,项目中的bin文件夹最好不要放在Vss里管理,我经常生成项目的时候,vs 2005会自动签出bin文件夹里的dll文件,这样每次其他同事生成的时候,我还要签入进去,感觉挺麻烦的,所以我用的话,不会把bin文件夹放在vss里管理。
VSS2005服务器端设置用户权限:
【工具】/【项目权限】:。
使用VC2005一些问题及解决方案(一)首先是我使用VC2005在不通阶段的不通感受:刚开始安装VS2005时候感觉:真是大啊!装了我一个上午!!而且运行个VC有时能耗我好大的内存。
刚使用VC2005时候的感受:界面挺不错,貌似功能更强大,对C++标准支持的很好,还可以用我最喜欢的Comic Sans MS字体,还支持代码收缩等等。
虽然比较慢,但是不像VC6. 0那样老是出现编译死机的情况。
开始用VC2005学习写东西的时候的感受:实在没有6.0好用,限制太多,很多地方跟VC6. 0不一样,而且很多功能似乎都找不到了。
还不如6.0方便。
使用一段时间的感受:虽然经常遇到问题但是都是有很好的解决方案的,而且相对6.0,2005的BUG少很多,总体来说如果机器配置还算可以的话,用2005是挺不错的。
下面就是我使用VC2005遇到的以及解决了的问题:VC遇到的以及解决了的问题1,对于Radio控件如何正确设置属性Group?首先要确保几个Radio控件的Tab是按顺序的(可以在对话框编辑器中按Ctrl+D将三个控件T ABORDER设置在一起)。
然后对第一个Radio控件选择Group属性,其他的不用选。
对第一个控件添加关联变量int m_test,并且设置初值-1,则当我们点击第一个控件m_test值是0,点击第二个m_test值是1....依此类推。
2,VC2005中添加虚函数问题:在VC6.0中可以对类右键添加虚函数,在VC2005中需要在类属性中点击一个重写按钮,在那里添加虚函数。
3,VC2005动态添加右键菜单问题:在VC6.0中我们可以在Project->Add To Project->Component and Control中添加组件,如添加Pop-up Menu可以实现添加右键快捷菜单的功能。
但是在VC2005中我们没有这个功能,但是我们可以手动自己添加,也不是很复杂。
步骤如下(假设工程是一般MFC视图工程命名Menu):1,自己添加一个Menu资源,例如命名为IDR_MENU1,编辑之。
本文属转载,原文地址:/shaozhuyong/article/details/7406366
Visual Studio 2005下C++智能设备应用程序常见错误及解决方法1、MFC智能设备应用程序不能创建的问题:
解决方法:
1.关闭VS2005,运行 RegEdit.exe
2.找到以下路径:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Ext\PreApproved
3.右键新建项:{D245F352-3F45-4516-B1E6-04608DA126CC}
4.关闭注册表
5.再运行VS2005即可了
2、.exe不是一个有效的PocketPC应用程序
解决方法:更改命令行成下面
3、RSFC.h找不到的问题
解决方法:设置附加库目录。
4、模拟器中只有一个.exe文件,无法执行。
解决方法:库目录没设置好,设置好后调试应该能解决。
5、.exe启动不了的问题
解决方法:可能类库引用有问题,往模拟器上上传类库应该可以解决。
6、在静态库中使用MFC引发的问题。
调试错误如图:
解决方法:解决方案管理——属性页——配置属性——常规——项目默认值——MFC的使用属性改为:在共享DLL 中使用MFC。
7、调试中出现无法解析的外部符号的另外一个可能原因是,在类中定义了一个函数,而没有实现,却直接调用。
解决方法:找到函数实现之。
未完待续…………。
在VS2005上编写、运行、调试C语言程序目录前言:关于C/C++编译器的简单介绍.............................- 2 - 1.编辑、编译与运行.........................................- 3 - 2.调试技术.................................................- 8 - 设置断点.................................................- 9 - 调试运行.................................................- 9 - 快速监视................................................- 10 - 3.小结....................................................- 13 - 附:VS2005快捷键大全期.....................................- 13 -前言:关于C/C++编译器的简单介绍Turbo C 2.0发布于1989年,对历史并不太长而发展却神速的IT业来说,确实是古董级的软件了。
但它几乎是最后一个专门为C语言设计的开发环境,具备学习C语言的一切条件,没有任何非C语言的东西干扰初学者,所以一直被各大高校的C语言课堂采用。
C++的发展使C++的开发环境大行其道。
因为C++几乎完全兼容C语言,两者无论编译器还是编辑器、调试器都可以用同一套程序实现,而且C++共享C的库函数,很多软件还是用两者混合编程实现,所以基本所有的C++环境都同时支持C语言。
Dev-c++是Windows平台下C++ IDE开发环境,属于共享软件。
界面亲切优雅,size也不大,其后续版有中文语言支持,无需汉化。
下面有从浅入深的6个问题,您可以尝试回答一下
1. 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么
在j=5前面插入断点
2. 在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能
做到呢?
3. 你有一个表达式在上面循环的某一次发生了变化,你想知道是哪一次,在哪个地方,
怎么才能做到?
4. 你希望你的断点在被命中100次后,每命中三次中断一次,比如第103,第106,
第109怎样做?
5. 你有在调试一个服务程序,希望在其内部打上了断点,可是,由于这是一个公用的
服务你不希望其他访问这个服务的程序被你的调试所干扰,你想怎么办?
6. 怎样知道2个断点中断的时间间隔
问题1,2
1. 一个如下的语句for (int i = 0; i < 10; i++){if (i == 5)j = 5;},什么都写在一行,你怎么
在j=5前面插入断点
2. 在一个1000次的循环体内部设置断点,你希望当循环进行到900次后中断,怎么才能
做到呢?
这两个问题最简单,我在一个例子里说明
例如如下循环
for(int i=0;i<1000;i++){doSomeThing......}
在循环的大括号上单击右键,插入断点,用这个方法,可以对付那些喜欢把语句写在一行上的家伙,其实,随着.Net3.5中Linq的出现,我们肯定也会经常在在一行上写复杂的表达式,这个时候用这种插入方法会比较管用
ok,现在我们来编辑这个断点的条件,在断点上右键单击,选择如图菜单项
在弹出的窗口中可以设置断点命中的条件i==900
注意我是在调试C#代码,默认的条件语句语法是C#,如果你想切换,那就需要用Ctrl-B,来插入断点,并在弹出窗口中选择语言
通过这样设置条件断点,我们就可以解决我们的问题1,2了
3. 你有一个表达式在上面循环的某一次发生了变化,你想知道是哪一次,在哪个地方,
怎么才能做到?
问题3
同样通过设置条件断点我们还可以解决我们的问题3,对表达式变化的跟踪
string user="yizhu2000"
for(int i=0;i<10000;i++){
DoSomething1()
.......
DoSomethingN()
}
当循环执行完毕时我们发现user变成了"smart_boy",你不知道这个值是在第几次循环的时候变化的,那么你是不是会选择打上断点,一次一次中断,来查看呢?当然不用
在循环体结束的位置我们设置一个断点,打开条件编辑窗口(打开方法同上),设置表达式为user,勾选下面的HasChanged,也就是说,你告诉断点,当user的值发生变化时才触发
(注意:第一次执行到断点的时候,程序一定会中断,并计算这时表达式的值,所以,所谓发生变化,指的是以后执行到断点是表达式的值和第一次执行到断点时表达式的值的比较)
问题4
4. 你希望你的断点在被命中100次后,每命中三次中断一次,比如第103,第106,
第109怎样做?
如何让断点在指定的命中次数或者大于某个次数时触发呢?方法是设定几个断点的HitCount,右键单击断点,在弹出菜单中选择Hit Count,会弹出如下窗口
在"when the break point is hit"下拉列表里,我们可以看到四个选项
break always:总是中断
break when the hit count is equal to:等于某次数时中断
beak when the hit count is a multpile of:当次数是某数的倍数时中断
break when the hit count is greater than or equal to:当大于等于某数时中断
问题5
5. 你有在调试一个服务程序,希望在其内部打上了断点,可是,由于这是一个公用的
服务你不希望其他访问这个服务的程序被你的调试所干扰,你想怎么办?
前面4个问题都已经解决了,第5个问题的解决方法是利用断点的Filter功能,比如我希望断点只有被机器名为yizhu的机器访问才能触发,我可以这样设置
当其他机器访问程序的时候,断点将不会触发,这样做的优点是通过设置机器名,我们可以让其他机器访问的时候感觉不到断点的存在,除此之外我们可以设置机器名,进程号,进程名,线程号,线程名作为filter,而且还可以把他们组合起来,比如我希望通过当机器yizhu的dllhost 进程调用时才触发,那么问题就可以设置为
MachineName="yizhu"&ProcessName="dllhost"
问题6
6. 怎样知道2个断点中断的时间间隔
现在我们来解决第6个问题:
在程序性能调试的时候,我们经常需要知道某段代码的执行效率,一般来说,我们可以在程序中加入时间点,通过时间点相减来取得时间间隔,这种方法有个显而易见的缺点就是需要修改程序,想要不修改程序,就需要借助一些工具,那么有没有什么方法可以声明式的插入时间点,并计算值呢?其实断点完全可以做到
在给出方法前,我们来看看断点的另外一个设置项,When Hit,这个选项可以让我们在命中断点后做一些事情,包括输出一些内容,或者调用宏,比如输出一个程序中变量的值
我们输出了变量user的值,下面Continue Execution表示程序不会中断,输出后继续执行,注意表达式需要用{}括起来,,其他的部分会被作为字符串输出。
设定WhenHit后断点变成了方形(看厌了圆断点,我还挺喜欢这个方家伙的)
在output中查看输出结果,如下:
既然可以计算表达式,我们的第一个最简方案就出来了,也就是在程序执行到断点的时候,输出DateTime.Now,这样当然是可行的,但是我们需要的是时间间隔,所以我们还需要自己来算个减法,还是挺麻烦的,怎么样才能让程序自己输出时间间隔呢?有一个想法是这样的,我们在上一个断点声明一个时间变量,然后在下面的断点里用DataTime.Now减去这个变量,即
断点一的条件:{DateTime _t=DateTime.Now;}
断点二的条件:{DateTime.Now-t;}
看起来不错,但是实际运行时就有问题了,让我们看看输出吧
上面高亮的部分说,变量申明只能在immediate window中进行,所以断点一的变量没有申明成功,关于immediatewindow,我们以后会涉猎到,反正就是说想在表达式里申明变量,没门,死路一条.那么我们怎么才能不申明变量又时间点呢?
这时我想起了Thread.SetData 方法,这个方法可以往当前线程专门提供的空间中插入一些数据,并且可以通过GetData得到数据,具体细节参考
/zh-cn/library/system.threading.thread.setdata(VS.80).aspx
于是方案就有了,在第一个断点处把时间放入Thread的DataSlot,然后第二个断点取出来相减
断点一的条
件:{Thread.SetData(Thread.GetNamedDataSlot("ExecutionTime"),DateTime.Now);}
断点二的条
件:{DateTime.Now-(DateTime)System.Threading.Thread.GetData(System.Threading.Thr ead.GetNamedDataSlot("ExecutionTime"));}
看看输出效果
我们的目的已经达到了,output中成功的输出了时间间隔,当然,还不是很完善,首先,这个方法限于两个断点,你想多打几个断点,测试两两间的间隔还是比较麻烦.测量精度也可以提高,大家有兴趣可以自己研究这个方法的扩展。