VC调试入门

合集下载

vc++6.0环境下程序调试教程

vc++6.0环境下程序调试教程

更多共享就在:/avbbtv/home,个人整理,没有版权,欢迎共享---avbbtv如何在Visual C++ 6.0 环境下进行简单的C语言程序调试桂林电子科技大学波仔*****************文章简介本文主要介绍如何在VC6.0 环境下进行简单的C 语言程序调试。

作为阅读本文的基础,读者应该熟悉如何在VC6.0 环境下建立Win32 Console Application(Win32控制台程序) 类型的工程。

请结合文章给出的案例,按照文档中的描述一步一步做。

如果只是阅读,则收效甚微。

在做完文章给出的案例后,你应该尝试着将文章中介绍的知识和技巧应用到你实际开发的程序中。

如果阅读完一遍后,对调试基本概念还是不了解,建议你再多看几遍。

在介绍如何进行C 语言程序调试( debugging)前,首先介绍程序调试的概念。

调试(debug)一词在计算机领域最早被提及,源于美国人Admiral Grace Hopper(葛丽丝·霍普、COBOL 语言发明者、电脑科学家) 。

二十世纪四十年代(1940s) Grace Hopper在哈佛大学为名为马克2 号(Mark II) 的计算机( 由IBM 公司制造) 编写程序时,有一次在排除计算机故障时,发现一只飞蛾被夹在触点原件之间,导致计算机无法运行。

于是她诙谐的把计算机故障称之为“臭虫(bug)”,把排除程序故障称之为debug 。

从此之后,在计算机领域,程序调试或查找程序故障称为debug 。

进行程序开发时,很多情况是程序通过编译、链接( 亦即不存在语法错误) ,但是在运行时往往得不到正确的结果( 需要多组输出数据进行测试)。

这时往往意味着程序存在逻辑错误( 与语法错误对应,通常是指程序所体现出的逻辑不符合开发者要求,或者是开发者本身对程序所要解决的某一问题的理解存在逻辑偏差) ,而查找逻辑错误的过程可称之为程序调试。

程序案例下面以一个程序案例为例,介绍如何在VC6.0 下进行程序调试。

VC程序调试.

VC程序调试.

VC程序调试VC程序调试调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言。

不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件。

一、VC程序调试方法 VC的调试功能:首先,再次强调要用Go命令运行一个将要调试的程序;如果要中止调试状态下的运行程序可以点击Stop Debugging命令,还可以通过Break选项以可恢复方式中断调试程序的运行流程(用Restart选项可以重新开始运行程序);Step Into选项表示每次只执行一行语句(单步执行),但如果当前代码是调用一个函数,那么Step Into表示进入该函数,全部函数语句执行完后返回,而Step Over则是跳出这个函数;Step To Cursor 选项表示程序将执行到光标所在的可执行语句行上;在调试多线程程序时,可以在线程函数或主应用程序线程中设置断点,还可以用Break选项结束线程后用Threads选项查看运行线程列表,也可以选择悬挂和恢复每个线程;在设置断点后,在VC "查看"菜单的"调试窗口"中可以查看变量、内存、调用堆栈、寄存器以及反汇编语句。

在程序中设置断点的方法是,点击要设置的代码行并点击设置代码的工具栏按钮,会出现在代码行最左边的一个小黑点即是断点标志,这时再选Go 程序会在执行到端点处停下来,如果要继续执行可以再选Go。

通过选择VC"工具"菜单下的"源浏览器"可以生成一个.BSC文件,使用浏览器可以从中发现多种信息:程序中任何一个变量、函数、类或宏在何处定义及引用;可以列出所有声明的函数类、变量、宏;可以发现调用一个指定函数的所有函数;可以找到一个指定类的派生来源或者它派生出哪些类。

在使用微软程序开发库MSDN时,我们会发现其中的VC示例经常采用看似多余的ASSERT语句,其作用就是使程序具有"维护"性。

VSCode调试C程序教程

VSCode调试C程序教程

VSCode调试C程序教程在编写和调试C程序时,一个好的集成开发环境(IDE)可以大大提高效率和准确性。

Visual Studio Code(简称VSCode)是一个流行的跨平台IDE,其强大的调试功能使得调试C程序变得更加简单和高效。

本教程将指导您如何使用VSCode调试C程序。

1. 安装VSCode及必要的插件首先,您需要从VSCode官方网站(https:///)下载并安装VSCode。

安装完成后,打开VSCode并转到扩展市场。

在搜索框中输入"C/C++",然后选择Microsoft提供的"C/C++"插件并安装。

该插件将为您提供调试C程序所需的基本功能。

2. 创建C项目在VSCode中创建一个新的C项目非常简单。

打开命令面板(Ctrl+Shift+P),输入"shell",选择"Shell: Greate new shell with current file"。

输入项目名称,并选择文件夹保存该项目。

VSCode将自动为您创建一个新的C项目。

3. 配置调试环境在VSCode的侧边栏中,找到并打开刚创建的C项目文件夹。

在文件夹中创建一个名为".vscode"的新文件夹,并在其中创建一个名为"launch.json"的文件。

打开"launch.json"文件,并添加以下配置:```json{"version": "0.2.0","configurations": [{"name": "C Debug","type": "cppdbg","request": "launch","program": "${workspaceFolder}/a.out","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": true}]}```此配置将告诉VSCode以C++调试器的方式来调试C程序,并设置程序的入口为编译后的可执行文件"a.out"。

VC6.0调试方法

VC6.0调试方法

VC6.0调试⽅法
1.打开你要调试代码的⼯作空间。

2.按快捷键F5或点击以下图⽚上标记的图标进⼊调试模式。

3.打开调试⼯具条,⼀般情况下当你按F5键后会⾃动弹出,如果没有弹出的话,右击⼯具栏空⽩处,会弹出下图,选中调试,就会出现调试⼯具条。

4.接下来,在监视窗⼝中添加你要监视数据变化的变量。

5.按F11逐语句的调试代码,如果某⼀语句是⼀函数,你不希望进⼊该函数时,F10逐过程来查看,在代码的调试过程中,通过监视窗⼝查看变量值的变化,从⽽确定代码是否有问题。

6.如果希望跳出某⼀函数时,按快捷键Shift+F11,或者直接点击调试⼯具条上的按钮就可以跳出该函数了。

7.如果只是希望调试某⼀部分代码的话,可以设置断点来调试,调试⽅法如上,只是在要调试的代码之间⽤断点来分开。

设置断点时,光标放在你要设置断点的那⾏,按F9或点击编译微型条上⾯的类似⼿状的按钮即可。

vc 入门经典 教程

vc 入门经典 教程

实验一:熟悉VC 开发环境,体验MFC(Microsoft Foundation Class)编程方式 1 V isual C++集成开发环境下面是Visual Studio 界面,可以进行c/c++程序的编辑、编译和运行。

2 “不做任何事情”的应用程序1)运行AppWizard 来产生SDI 应用程序。

VC 提供了一个AppWizard 向导来帮助用户创建不同类型的应用程序,这里我们创建较为简单的单文档程序。

在File 菜单项中选择New,然后在New 对话框中单击Project 标签,显示如下:确保选择MFC AppWizard(exe),并填好上面的项目名称(project name 标签)和项目所在目录(location标签)。

单击OK按钮,我们下面通过一系列AppWizard屏幕操作来建立项目,首先是下面的屏幕:这里选择Single Document选项。

然后在接下去的四个屏幕节目上都接受默认参数。

最后的屏幕提示如下图所示:注意,类名和源文件名已经根据项目名产生了,一般类名的默认取名规则是以C开头,接着是项目名,称最后接上功能名称。

上图中的这几个类分别继承于MFC提供的类CView、CWinApp、CFrameWnd和CDocument。

CTest01App的对象代表了应用程序,CMainFrame 类的对象代表着应用程序的主框架窗口。

一般文件的命名比类的命名少开头的C字母。

单击Finish按钮。

在AppWizard产生源代码之前,他将显示New Project Information对话框,如下图所示。

用鼠标单击OK按钮,AppWizard就会开始创建应用程序的子目录(比如此例,在F:\myproject\下的test01)和该子目录下的一些文件。

2)对所产生的代码进行编译和链接。

可以通过选择Build菜单中的Build test01.exe菜单项来创建应用程序或者单击工具栏按钮。

如果创建成功,在应用程序所在目录F:\myproject\test01下将建立一个新的Debug目录,在该目录下将生成一个可执行文件test01.exe。

我调试了一个完整的VC检测服务、启动服务、停止服务的程

我调试了一个完整的VC检测服务、启动服务、停止服务的程

我调试了一个完整的VC检测服务、启动服务、停止服务的程序,结构不复杂,就三个函数。

该例子是以系统自带的打印缓存服务(Print Spooler)为例演示的。

另外我写了个详细的开发教程,你自己熟悉一下。

// 注意,此程序适应的服务名称仅为单字符串。

Spooler (√)Net Logon (×)VC开发服务管理程序简单教程一、新建VC对话框程序(此例子为SrvCheck),设计界面如下:二、在SrvCheckDlg.cpp中加入服务相关的头文件:winsvc.h,如下图:#include <winsvc.h>三、在SrvCheckDlg.cpp文件末尾加入以下函数定义:int ServiceIsRunning(LPCTSTR ServiceName) //检测是否运行{SC_HANDLE schService; // ?## 句柄SC_HANDLE schSCManager;DWORD RC; //double word 双字节SERVICE_STA TUS ssStatus;UINT return_value;schSCManager = OpenSCManager(NULL, // machine (NULL == local)NULL, // database (NULL == default)SC_MANAGER_ALL_ACCESS // access required);// OpenSCManager函数建立了一个连接到服务控制管理器,并打开指定的数据库if (!schSCManager) return -1;schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);if (!schService) {RC = GetLastError();CloseServiceHandle(schSCManager);if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;else return -1;}QueryServiceStatus(schService, &ssStatus);if(ssStatus.dwCurrentState == SERVICE_RUNNING) return_value = 1;else return_value = 0;CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return return_value;}int ServiceStart( LPCTSTR ServiceName) //启动LPCTSTR 是一种类型L:long P:指针// C: 容量T:win32环境STR:变量是一个字符串{SC_HANDLE schService;SC_HANDLE schSCManager;DWORD RC;UINT return_value;schSCManager = OpenSCManager(NULL, // machine (NULL == local)NULL, // database (NULL == default)SC_MANAGER_ALL_ACCESS // access required);if (!schSCManager) return -1;schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);if (!schService) {RC = GetLastError();CloseServiceHandle(schSCManager);if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;else return -1;}return_value = StartService(schService, 0, NULL) ? 1 : -1;RC = GetLastError();CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return return_value;}int ServiceStop(LPCTSTR ServiceName,ULONG TimeoutSeconds) //停止{SC_HANDLE schService;SC_HANDLE schSCManager;DWORD RC;UINT return_value;SERVICE_STA TUS SrvStatus;schSCManager = OpenSCManager(NULL, // machine (NULL == local)NULL, // database (NULL == default)SC_MANAGER_ALL_ACCESS // access required);if (!schSCManager) return -1;schService = OpenService(schSCManager, ServiceName, SERVICE_ALL_ACCESS);if (!schService) {RC = GetLastError();CloseServiceHandle(schSCManager);if (RC == ERROR_SERVICE_DOES_NOT_EXIST) return -2;else return -1;}return_value = ControlService(schService, SERVICE_CONTROL_STOP, &SrvStatus) ? 1 : -1;if(return_value) {while(QueryServiceStatus(schService, &SrvStatus)) {if ( SrvStatus.dwCurrentState == SERVICE_STOP_PENDING ) {if(!TimeoutSeconds)break;if(TimeoutSeconds != -1)TimeoutSeconds--;Sleep( 1000 );} else {break;}}if(SrvStatus.dwCurrentState == SERVICE_STOPPED) { return_value = 1;} else {return_value = -1;}} else {return_value = -2;}RC = GetLastError();CloseServiceHandle(schService);CloseServiceHandle(schSCManager);return return_value;}四、各按钮代码如下:①检测服务if(ServiceIsRunning("Spooler")==1)MessageBox("服务运行中......");elseMessageBox("未检测到服务运行!");②停止服务if(ServiceStop("Spooler",10)==1)MessageBox("服务已停止运行!");③启动服务if(ServiceStart("Spooler")==1)MessageBox("服务已成功启动!");Net LogonWebClient………………………………………………………………………………………………void CFuwuDlg::OnButton1(){// TODO: Add your control notification handler code hereCString strTemp;GetDlgItemText(IDC_EDIT1,strTemp);if(ServiceIsRunning(strTemp)==1)MessageBox("服务运行中......");elseMessageBox("未检测到服务运行!");}。

VC单步调试

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窗口),而右面的我们称之为“手动监视区”。

vc6.0安装教程与调试技巧

vc6.0安装教程与调试技巧

vc6.0的安装过程1.首先解压安装文件的压缩包2.然后再选择安装的版本,VC6CN 表示的是中文版,VC6EN表示英文版。

3.打开VC6CN文件夹,其中有如下图标,鼠标双击。

4.如下图所示就是我们安装的第一步,单击下一步。

5.选择“接受协议”后单击下一步。

6.本软件属于破解版,故无需输入产品ID号码,直接单击下一步。

7.选择“安装visual c++6.0中文企业版(I)”,这就是我们要安装的程序,单击下一步。

8.单击下一步。

9.如下界面,单击“继续”,开始安装软件。

10.点击“确定”。

11.选择“是”,继续安装。

12.选择“typical”继续安装13.选择“ok”。

14.选择“确定”15.选择“确定”16.取消“安装MSDN”前面的勾号,选择“退出”。

17.选择“是”,取消MSDN的安装。

18.程序安装完毕,再电脑的“开始菜单”中,选择“所有程序”,在“Microsoft Visual C++ 6.0”目录中选择“Microsoft Visual C++ 6.0”就可以运行程序了。

也可以将这个图标发送到桌面快捷方式,这样就可以直接在桌面上运行程序。

调试技巧调试程序可以帮助的了解程序是怎样运行的。

1、如何快速地规范代码缩进格式选中所需要规范的代码,按shift+F82、如何在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版一样。

vc6.0调试技巧

vc6.0调试技巧

/Zi
Program Database
创建一个程序库(PDB),包括类型信息和符号调试信息。
/ZI
Program Database for Edit and Continue
除了前面/Zi的功能外,这个选项允许对代码进行调试过程中的修改和继续执行。这个选项同时使#pragma设置的优化功能无效
Life is like a box of chocolate, you never know what you are going to get.
二、调试的一些技巧
1、使用ASSERT和VERIFY(原则:尽量简单)
ASSERT:它接收一个表达式,如果这个表达式为TRUE,则无动作,否则中断当前程序执行。对于系统中出现这个宏导致的中断,应该认为你的函数调用未能满足系统的调用此函数的前提条件。例如,对于一个还没有创建的窗口调用SetWindowText等。
vc6.0调试技巧
一、基本的调试设置
1、CTRL+F10:运行到当前光标处 DEBUG模式下 用F9在要看的语句上打好断点,F5调试运行,F10单步运行。
2、设置
为了调试一个程序,首先必须使程序中包含调试信息。一般情况下,一个从AppWizard创建的工程中包含的Debug Configuration自动包含调试信息,但是是不是Debug版本并不是程序包含调试信息的决定因素,程序设计者可以在任意的Configuration中增加调试信息,包括Release版本。
LocalFree( lpMsgBuf );
LPVOID lpMsgBuf;
但是也要注意:由于用GetLastError插得代码七零八碎。在Watch窗里使用变量@err时就可以立即看到当前的LastError码。

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、当你移除某个资源时,确保你移除了所有跟这个资源相关的申明(主要是在文中)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宏也就随之被激活了。

vc使用方法

vc使用方法

vc使用方法VC 使用方法。

VC 是一款功能强大的集成开发环境,可以帮助开发者进行C/C++ 程序的开发。

本文将介绍 VC 的基本使用方法,帮助初学者快速上手。

1. 安装 VC。

首先,你需要从官方网站下载 VC 的安装包,并按照提示进行安装。

安装完成后,打开 VC,你将看到一个简洁的界面,包括菜单栏、工具栏、编辑区和输出区。

2. 创建新项目。

在 VC 中,你可以创建新项目来进行开发。

点击菜单栏中的“文件”选项,选择“新建”,然后选择“项目”。

在弹出的对话框中,选择项目类型(如控制台应用程序、Windows 桌面应用程序等),填写项目名称,点击“确定”即可创建新项目。

3. 编写代码。

在创建新项目后,你可以在编辑区编写代码。

VC 提供了丰富的代码编辑功能,包括代码高亮、自动补全、代码折叠等,可以大大提高编码效率。

4. 调试程序。

在编写完代码后,你可以点击工具栏中的“调试”按钮来进行程序调试。

VC 提供了强大的调试功能,可以帮助你快速定位和解决程序中的 bug。

5. 构建和运行程序。

当程序编写完成并通过调试后,你可以点击工具栏中的“生成”按钮来构建程序。

构建完成后,你可以点击“运行”按钮来运行程序,查看程序的运行效果。

6. 其他功能。

除了上述基本功能外,VC 还提供了许多其他功能,如版本控制、性能分析、代码重构等,可以帮助你更好地进行程序开发和维护。

总结。

通过本文的介绍,相信你已经对 VC 的基本使用方法有了一定的了解。

当然,VC 还有很多其他功能和技巧等待你去探索和学习。

希望本文能够帮助你快速上手 VC,并顺利进行 C/C++ 程序的开发工作。

祝你编程愉快!。

VC入门教程

VC入门教程

VC入门教程vc入门教程一走进 Visual C++1 理解VC工程2 MFC编程特点3使用Wizard二 MFC 程序结构分析1 WINDOWS程序工作原理2 建立应用程序3 程序结构剖析3(1 类CMYAPP3(2 类CMAINFRAME3(3类CMyView与CMyDoc三深入MFC类库1 处理用户输入1(1 定义对话框资源1(2 定义对话框类2 有关屏幕输出2(1 设备上下文工作原理2(2 实例绘图原理剖析2(3 绘图操作实现2(4 有关屏幕映射方式3 文件处理3(1 对象持续化简述3(2 实例分析3(3 与文件处理关系密切的类CFile4 DAO技术4(1 DAO与ODBC4(2 使用MFC实现DAO技术5 打印5.1打印和显示5.2打印分页5.3 打印工作的开始和结束5.4 打印程序实例四、VC程序调试1(1 调试环境的建立1(2调试的一般过程1(3 如何设置断点1(4 控制程序的运行1(5 查看工具的使用2 高级调试技术2.1 TRACE 宏的利用2.2 ASSERT宏的利用2.3 ASSERT_VALID宏的利用以及类的AssertValid()成员函的重载2.4对象的DUMP函数的利用3 内存漏洞的检查五 Visual C++ 与多媒体1 对声音的处理1(1媒体控制接口1(2波形混音器2 多媒体文件I/O3多媒体图形图像技术;4图像合成;5 FLC动画;6热点;一走进 Visual C++Visual C++作为一个功能非常强大的可视化应用程序开发工具,是计算机界公认的最优秀的应用开发工具之一。

Microsoft的基本类库MFC使得开发Windows应用程序比以往任何时候都要容易。

本光盘教学软件的目的就是为了让你学会在Visual C++环境下,利用微软的基本类库MFC开发出功能强大的Windows应用程序。

在本章节的内容当中,我们将向您介绍使用VC开发软件需要用到的一些基本概念,使用MFC进行编程的基本特点,以及VISUAL C++集成开发环境提供的一系列编程辅助工具--WIZARD的使用方法。

VisualStudio断点调试与内存分析教程

VisualStudio断点调试与内存分析教程

VisualStudio断点调试与内存分析教程第一节:Visual Studio断点调试介绍Visual Studio作为一款流行的集成开发环境(IDE),提供了丰富的调试功能,其中断点调试是开发人员经常使用的功能之一。

断点调试可以让开发人员在程序运行过程中暂停程序的执行,以便观察变量的值、检查代码的执行流程和调试程序的错误。

第二节:使用断点设置1. 单击源代码行的行号或按F9键,可以在该行设置一个断点。

断点会在程序执行到该行时暂停程序的执行。

2. 设置条件断点:在断点属性中可以设置条件,只有满足条件的情况下,程序才会暂停执行。

3. 设置条件断点和数据断点:条件断点可以在特定条件下暂停程序的执行;数据断点可以在特定变量的值发生改变时暂停程序的执行。

第三节:断点调试的常用功能1. 单步执行:在程序暂停时,可以逐行执行代码。

单击工具栏上的“单步执行”按钮或按F10键可以逐行执行代码。

2. 监视窗口:监视窗口可以用来观察变量的值。

在程序暂停时,可以将变量添加到监视窗口中,随时查看其值的变化。

3. 自动变量窗口:自动变量窗口会显示当前作用域内的所有变量及其值。

在程序暂停时,可以使用自动变量窗口来检查变量的值。

4. 调用堆栈窗口:调用堆栈窗口会显示函数的调用顺序。

在程序暂停时,可以查看当前函数的调用堆栈,方便程序调试。

第四节:内存分析工具介绍Visual Studio还提供了一些内存分析工具,用于帮助开发人员识别和修复内存相关的问题,例如内存泄漏和访问冲突。

以下是一些常用的内存分析工具:1. 内存窗口:内存窗口可以显示程序的内存使用情况,包括分配的内存块和它们的地址。

2. 实时内存分配跟踪:实时内存分配跟踪可以记录程序运行时分配的内存块的详细信息,包括分配的位置和释放的位置。

3. 静态分析工具:静态分析工具可以在编译时检查代码中的潜在内存问题,例如使用未初始化的变量或释放已经释放的内存。

第五节:内存分析的基本步骤1. 在程序中插入内存相关的代码:为了分析内存问题,需要在程序中插入代码来记录内存分配和释放的位置,以及其他关键信息。

VC6.0 IDE的使用和程序调试技巧

VC6.0 IDE的使用和程序调试技巧

项目工作区窗口

ClassView页
FileView页 ResourceView页
FileView页
ClassView页
File->New->Proj32 Application
基于WINDOWS平台的32位开发环境开发应用程序,SDK程序。 入口函数为WinMain
文件类型 Active Server Page Bitmap File C/C++ Header File HTML Page Resource Script Resource Template
Visual C++6.0 可以创建的文件类型 说明 文件类型 网页制作 Binary File 创建位图文件 C++ Source File 创建 C/C++头文件 Cursor File 创建 HTML 文件 Icon File 创建资源脚本文件 Text File 创建资源模板文件 SQL Script File
6:使用单步执行到程序结束


设置断点以后,调试运行程序时,程序 开始执行,并且运行到断点处暂停下来, 此时我们有机会观察程序的运行情况, 并且诊断程序目前的状态是否如我们所 预期的那样。 不过我们先不着急观察程序的状态,而 是来看看如何控制程序的运行,以便在 我们需要的时候让程序暂停下来,并且 以我们需要的方式走走停停!
方法是使用单步执行手段stepover让程序向前走一步停止调试停止调试并重新启动调试单步执行当前位置对比调试运行时出现的调试菜单debug和调试工具栏根据图标查找对应项设置断点调试运行程序此时程序暂停在断点处等待选择debug菜单找到最后一项quickwatch并点击输入想要观察的变量变量名变量的值点击addwatch点击addwatch看到如下画点击单步执行按钮或者菜单程序则向前单独运行一个步骤每向前执行一步就会暂停下来这样我们就有充足的时间观察所关心的变量名称按下f5键可以让程序从当前位置向前执行直到遇见下一个断点或者程序结束下面是赠送的ppt模板不需要朋友可以下载后编辑删除

VS的10个调试技巧

VS的10个调试技巧

Visual Studio原生开发的10个调试技巧最近碰巧读了Ivan Shcherbakov写的一篇文章,《11个强大的Visual Studio调试小技巧》。

这篇文章只介绍了一些有关Visual Studio的基本调试技巧,但是还有其他一些同样有用的技巧。

我整理了一些Visual Studio(至少在VS 2008下)原生开发的调试技巧。

(如果你是工作在托管代码下,调试器会有更多的特性,在CodeProject中有介绍它们的文章),下面是我的整理的一些技巧:1. 异常中断| Break on Exception2. Watch窗口中的伪变量| Pseudo-variables in Watch Windows3. 符号越界后查看堆对象|4. 查看数组的值5. 避免进入不必要的函数6. 从代码启动调试器| Launch the debugger from code7. 在Output窗口打印8. 隔离内存泄漏9. 调试发行版| Debug the Release Build10. 远程调试技巧1:异常中断在处理被调用之前,异常发生时可以启动调试器进行中断,可以让你在异常发生后立即调试程序。

操作调用栈便于你去查找异常发生的根本原因。

Vistual Studio允许你去指定想要中断的异常类型或者特殊异常。

选择菜单Debug>Exceptions弹出对话框,你可以指定原生的(或者托管的)异常,除了调试器自带的一些默认异常,你还可以添加自己的自定义异常。

下面是一个std::exception 异常抛出时调试器中断的例子。

∙1.异常抛出时如何中断∙2.如何添加新的异常技巧2:Watch窗口中的伪变量Watch窗口或QuickWatch对话框提供一些特定的(调试器可识别的)变量,被称为伪变量。

文档包含以下:∙$tid—–当前线程的线程ID∙$pid——进程ID∙$cmdline———-启动程序的命令行字符串∙$user———-正在运行程序的账户信息∙$registername—–显示寄存器registername 的内容不管怎么样,关于最后一个错误的伪变量是非常有用的:∙$err——–显示最后一个错误的错误码∙$err,hr—显示最后一个错误的错误信息技巧3:符合越界后查看堆对象有时候,在调试符号越界后,你还想查看对象的值,这个时候,watch窗口中的变量是被禁用的,不能再查看(也不能更新),尽管对象仍然存在。

VC++6.0 Debug单步调试简单入门

VC++6.0 Debug单步调试简单入门

本篇文章为大家简单介绍如何使用VC++6.0的Debug来设置断点,进行单步调试。

熟练使用Debug单步调试后,你找出并改正bug的速度和效率将大大提高,所谓磨刀不误砍柴工呀!相信大家对谭浩强童鞋都不陌生,想当年,是他引领我们步入了C的殿堂,我们从他那里学会了如何写代码,他却没有教我们如何Debug,而我们伟大的老师,也对此只字不提。

相信很少有人可以一次性写出完全正确的代码。

对于我们这些个菜鸟来说,写出不带bug的代码倒是一件很不正常的事情。

也许你知道有 Debug这么个东西,但却不知道该怎样用;也许你还停留在在代码中添加N个printf来输出查看到底是哪里出了问题;也许……总之,经验表明,你花费时间看完这篇文章并学会简单的使用Debug,绝对不是浪费时间!废话少说,进入正题:编译0 error(s), 0 warning(s)链接0 error(s), 0 warning(s)当你按捺不住激动滴心情点击运行后,发现结果并不是你想要的结果……郁闷了。

然后你在代码中加了n条printf来查看变量的结果……n多循环……运行,再加printf,again and again……终于,要抓狂了……好吧,同学,如果你会用Debug,也许你不用这么纠结。

下面通过一简单例子说明如何使用Debug的一些“基本”(我也只是刚入门的小菜鸟,高级的修行要靠自己的了)功能:写了如图中的一个简单程序,编译链接都没有错误,运行结果却不理想(不正确)需要指出的是,主函数不要再用void main()了,这种只有在你学的环境才不会出错,到别的(linux编译器)地方编译是通过不了的。

main函数必须要有返回值,如写成int main()在函数结尾时加一个return 0;,这样,所有编译器都不会报错了。

最终结果确定是逻辑错误,如果不用单步调试,很难找出这种错误的。

这里先提到一个断点的概念,顾名思义,既是在你需要的地方让它断开,如果你在某一行代码处添加了断点,那么程序运行到断点处即会暂停,不再继续往下运行,直到接到你继续运行的命令。

c程序调试方法以及常见错误

c程序调试方法以及常见错误

目录使用VC6.0对C语言程序进行调试的基本手段 (2)(1)设置固定断点或临时断点 (2)(2)单步执行程序 (2)(3)使用断言 (3)(4)与调试相关的操作菜单:Build菜单 (4)(5)与调试相关的操作菜单:Debug菜单 (4)VC6.0常见编译错误提示 (6)(1)error C2001: newline in constant (6)(2)error C2015: too many characters in constant (6)(3)error C2137: empty character constant (6)(4)error C2018: unknown character '0x##' (6)(5)error C2041: illegal digit '#' for base '8' (6)(6)error C2065: 'xxxx' : undeclared identifier (7)(7)error C2086: 'xxxx' : redefinition (7)(8)error C2374: 'xxxx' : redefinition; multiple initialization (7)(9)C2143: syntax error : missing ';' before (identifier) 'xxxx' (8)(10)error C4716: 'xxx' : must return a value (8)(11) warning C4508: 'main' : function should return a value; 'void' return typeassumed (8)(12)warning C4700: local variable 'xxx' used without having been initialized (8)VC60.0常见链接错误 (10)(1)error LNK2001: unresolved external symbol _main (10)(2)error LNK2005: _main already defined in xxxx.obj (10)使用VC6.0对C语言程序进行调试的基本手段(1)设置固定断点或临时断点所谓断点,是指定程序中的某一行,让程序运行至该行后暂停运行,使得程序员可以观察分析程序的运行过程中的情况。

我调试了一个完整的VC检测服务启动服务停止服务的程

我调试了一个完整的VC检测服务启动服务停止服务的程

我调试了一个完整的VC检测服务启动服务停止服务的程----bfec8d8c-6eb2-11ec-ac62-7cb59b590d7d我调试了一个完整的vc检测服务、启动服务、停止服务的程我调试了一个完整的VC检测服务、启动服务和停止服务程序。

结构并不复杂,只有三个功能。

以系统自己的打印缓存服务(printpooler)为例演示了这个示例。

此外,我还编写了一个详细的开发教程供您熟悉。

//注意,此程序适应的服务名称仅为单字符串。

spooler(√)netlogon(×)VC开发服务管理程序简单教程一、新建vc对话框程序(此例子为srvcheck),设计界面如下:二、在srvcheck DLG中,将与服务相关的头文件添加到CPP:winsvc h。

如下所示: #include三、在srvcheck DLG中,在cpp文件末尾添加以下函数定义:intserviceisrunning(lpctstrservicename)//检测是否运行{sc_uuhandleschservice;//?#Handle SC_uuHandleschscManager;dwordrc;//doubleword双字节服务状态状态;uintreturn_u值;schscmanager=openscmanager(null,//机器(null==local)null,//数据库(null==default)sc_uu管理器uuuu 所有uu访问//accessrequired);//openscmanager函数建立了一个连接到服务控制管理器,并打开指定的数据库if(!schscmanager)return-1;schservice=openservice(schscmanager、servicename、service_all_access);如果(!schservice){rc=getlasterror();closeservicehandle(schscmanager);if(rc==error_service_does_not_exist)return-2;elsereturn-1;}查询服务状态(schservice和ssstatus);if(ssstatus.dwcurrentstate==service_running)return_value=1;elsereturn_value=0; closeservicehandle(schservice);closeservicehandle(schscmanager);returnreturn_v alue;}Intservicestart(lpctstrservicename)//start lpctstr是类型L:longp:pointer//C:capacity t:Win32 environment STR:variable是字符串{sc_handleschservice;sc_handleschscmanager;dwordrc;uintreturn_u值;schscmanager=openscmanager(null,//机器(null==local)null,//数据库(null==default)sc_uu管理器uuuu 所有uu访问//accessrequired);如果(!schscmanager)返回-1;schservice=openservice(schscmanager,servicename,service_all_access);if(!schser vice){rc=getlasterror();closeservicehandle(schscmanager);如果(rc==错误\服务\不存在)返回-2;elsereturn-1;}return_value=startservice(schservice,0,null)?1:-1;rc=getlasterror();closeservicehandle(schservice);closeservicehandle(schscmanager);返回返回值;}intservicestop(lpctstrservicename,ulongtimeoutseconds)//停止{sc_uu无手柄服务;sc_uu;handleschscmanager;dwordrc;uintreturn_value;service_statussrvstatus;schscmanager=openscmanager(null,//machine(null==local)null,//database(null==default)sc_manager_all_access //accessrequired);if(!schscmanager)return-1;schservice=openservice(schscmanager、servicename、service_all_access);如果(!schservice){rc=getlasterror();closeservicehandle(schscmanager);if(rc==error_service_does_not_exist)return-2;elsereturn-1;}return_uvalue=controlservice(schservice、service_control_stop和srvstatus)?1:-1;if(return_value){while(查询服务状态(schservice和srvstatus)){if(srvstatus.dwcurrentstate==service_stop_pending){if(!timeoutseconds)break;如果(timeoutseconds!=-1)timeoutseconds--;sleep(1000);}else{break;}}如果(srvstatus.dwcurrentstate==service_stopped){return_value=1;}否则{return_value=-1;}}else{返回值=-2;}rc=getlasterror();closeservicehandle(schservice);closeservicehandle(schscmanager);返回返回值;}四、各按钮代码如下:①检测服务If(serviceirunning)\MessageBox(\service running…\else MessageBox(\service running未检测到!)② 停止服务if(servicestop(\messagebox(\服务已停止运行!\③启动服务If(servicestart)\MessageBox(\服务已成功启动\netlogon网络客户………………………………………………………………………………………………voidCfuwLG::onbutton1(){//todo:在此处添加YourControlNotificationHandlerCodecstringstrtemp;getdlgitemtext(idc_edit1,strtemp);If(serviceirunning(strtemp)==1)MessageBox(\service running…\else MessageBox(\service running not detected!\}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC调试入门
概述
调试是一个程序员最基本的技能。

程序员即使学会一门语言,如果不掌握基本的调试技能,实际上是不可能编制出实用软件来的。

因为编程的过程同时也必将是一个反复调试的过程。

这里我根据同学们的《C语言程序设计》课程学习需要列出调试中最基础、也最实用的技巧,希望大家掌握。

本文约定:1)灰色部分为高级内容,同学们可以略过不看;2)下文中,在介绍菜单项时,用“/”表示分级菜单,例如File/Open表示顶级菜单File的子菜单Open。

断点
断点是调试器设置的一个代码位置。

当程序运行到断点时,程序中断执行,回到调试器。

断点是最常用的技巧。

调试时,只有设置了断点并使程序回到调试器,才能对程序进行在线调试。

设置断点:可以通过下述方法设置一个断点。

首先把光标移动到需要设置断点的代码行上,然后
•按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页,就可以设置消息断点。

如果在上面那个对话框中写入消息处理函数的名字,那么每次消息被这个函数处理,断点就到达(我觉得如果采用普通断点在这个函数中截获,效果应该一样)。

如果在底下的下拉列表框选择一个消息,则每次这种消息到达,程序就中断。


Watch
VC支持查看变量、表达式和内存的值。

所有这些观察都必须是在断点中断的情况下进行。

观看变量的值最简单,当断点到达时,把光标移动到这个变量上,停留一会就可以看到变量的值。

VC提供一种被成为Watch的机制来观看变量和表达式的值。

在断点状态下,在变量上单击右键,选择Quick Watch,就弹出一个对话框,显示这个变量的值。

单击Debug工具条上的Watch按钮,就出现一个Watch视图
(Watch1,Watch2,Watch3,Watch4),在该视图中输入变量或者表达式,就可以观察变量或者表达式的值。

注意:这个表达式不能有副作用,例如++运算符绝对禁止用于这个表达式中,因为这个运算符将修改变量的值,导致软件的逻辑被破坏。

Memory
由于指针指向的数组,Watch只能显示第一个元素的值。

为了显示数组的后续内容,或者要显示一片内存的内容,可以使用memory功能。

在Debug工具条上点memory按钮,就弹出一个对话框,在其中输入地址,就可以显示该地址指向的内存的内容。

Varibles
Debug工具条上的Varibles按钮弹出一个框,显示所有当前执行上下文中可见的变量的值。

特别是当前指令涉及的变量,以红色显示。

寄存器
Debug工具条上的Reigsters按钮弹出一个框,显示当前的所有寄存器的值。

进程控制
VC允许被中断的程序继续运行、单步运行和运行到指定光标处,分别对应快捷键F5、F10/F11和CTRL+F10。

各个快捷键功能如下:
快捷键说明
F5 继续运行
F10 单步,如果涉及到子函数,不进入子函数内部
F11 单步,如果涉及到子函数,进入子函数内部CTRL+F10 运行到当前光标处。

Call Stack
调用堆栈反映了当前断点处函数是被那些函数按照什么顺序调用的。

单击Debug工具条上的Call stack就显示Call Stack对话框。

在CallStack 对话框中显示了一个调用系列,最上面的是当前函数,往下依次是调用函数的上级函数。

单击这些函数名可以跳到对应的函数中去。

其他调试手段
系统提供一系列特殊的函数或者宏来处理Debug版本相关的信息,如下:宏名/函数名说明
TRACE 使用方法和printf完全一致,他在output框中输出调试信息
ASSERT 它接收一个表达式,如果这个表达式为TRUE,则无动作,否则中断当前程序执行。

对于系统中出现这个宏导致的中断,应该认为你的函数调用未能满足系统的调用此函数的前提条件。

例如,对于一个还没有创建的窗口调用SetWindowText等。

VERIFY 和ASSERT功能类似,所不同的是,在Release版本中,ASSERT不计算输入的表达式的值,而VERIFY计算表达式的值。

关注
一个好的程序员不应该把所有的判断交给编译器和调试器,应该在程序中自己加以程序保护和错误定位,具体措施包括:
•对于所有有返回值的函数,都应该检查返回值,除非你确信这个函数调用绝对不会出错,或者不关心它是否出错。

•一些函数返回错误,需要用其他函数获得错误的具体信息。

例如accept返回INVALID_SOCKET表示accept失败,为了查明具体
的失败原因,应该立刻用WSAGetLastError获得错误码,并针对性
的解决问题。

•有些函数通过异常机制抛出错误,应该用TRY-CATCH语句来检查错误
•程序员对于能处理的错误,应该自己在底层处理,对于不能处理的,应该报告给用户让他们决定怎么处理。

如果程序出了异常,却不
对返回值和其他机制返回的错误信息进行判断,只能是加大了找错
误的难度。

高级设置
为了调试一个程序,首先必须使程序中包含调试信息。

一般情况下,一个从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 可以选择。

选中这个选项,将使程序可以在上一次编译的基础上被编译(即增量编译),而不必每次都从头开始编译。

相关文档
最新文档