VC编程之在VC中使用Debug
小标 2019-01-15 来源 : 阅读 1323 评论 0

摘要:本文主要向大家介绍了VC编程之在VC中使用Debug,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之在VC中使用Debug,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

VC编程之在VC中使用Debug

VC - 在debug输出窗口中显示无法显示完整的变量内容
在调试时,由于变量内容(一般是字符串)过长,变量窗口将不会完整显示该变量内容,且无法拷贝出,此时可以使用OutputDebugString方法将其打印到debug调试信息窗口。
————————————————————————————————————————————
OutputDebugString 加强版(Debug) <转载>
当一个大型程序中存在着一个非常隐蔽的错误(所谓隐蔽,指的是我从运行过程中发现程序不正常,但是即使检查源代码,也很难发现何处存在错误),于是乎,我们在运行过程中添加一些输出语句,把中间结果或者程序状态输出出来,根据大量的结果来推测程序究竟出错在何处。这种情况是绝非程序断点能够搞定的,因为有时候你断无可断(特别是对于DLL程序的调试)。由于我们输出的debug信息只能由Dbmon.exe(或Dbgview.exe)来显示。所以,即使程序发布之后,也无须去掉这些调试点,这样对以后排错也很有利。

  OutputDebugString 是微软提供给我们用于输出调试信息的API函数,但是它只能直接输出的是字符串,而像GetLastError()返回数字型的的信息,需要经过类型转换(使用itoa将整型转换为字符数组)才能输出,比较麻烦。我们需要一种类似于printf函数的信息输出函数,它可以支持输出任何类型,任何个数的数据,例如:

printf("地址: %p,字符串: %s,错误号:%d\n ",p1,szStr,GetLastError());

  下面的一个自定义的调试信息输出函数(MyDebug),它实现了我们期望的功能,经过我在项目中的实际使用,发现效果很不错。
#include  
#include  
#include  

void MyDebug(const char * sz, ...) 

char szData[512]={0}; 

va_list args; 
va_start(args, sz); 
_vsnprintf(szData, sizeof(szData) - 1, sz, args); 
va_end(args); 

OutputDebugString(szData); 
 }

使用起来很简单,和printf函数调用格式基本一样,例如:

MyDebug("地址: %p,字符串: %s,错误号:%d\n ",p1,szStr,GetLastError());
================================================================================
在调试状态下,用各种调试器可以捕捉程序中的 OutputDebugString 输出的信息。其实 OutputDebugString 就是往一片共享影射的内存中写入了一段数据,并创建了两个 Enevt,指明数据写入事件被触发。在delphi的OutputDebugString 输出的信息会在Event log窗口可以显示,如果是调试环境外运行,还可以用Debugview,AQTime等调试工具查看输出的信息。如果是使用Debugview这工具,还可以远程查看输出信息,这样就可以非常方便地捕捉和处理代码中调试信息的输出 
OutputDebugString(PChar(SysErrorMessage(GetLastError))); 
也可以为OutputDebugString再做层函数封装,以更方便的使用: 
procedure OutputDebugStr(const ADebugInfo: string);  
begin  
  OutputDebugString(PChar(ADebugInfo));  
end; 
Debugview的下载地址:

1.选定Debug编译选项
Build -> Set Active Configuration -> Win32 Debug
或者在Build工具栏上的ListBox中选择Debug。
Debug定义了_DEBUG宏,而Release定义了NDEBUG宏。
2.先按F12编译Browse信息
这样编译后可以查到变量定义。 
3.执行Debug
按F5(注意,如果按Ctrl+F5 是Run,起不到Debug的作用)。
在Debug时一定要把Debug工具栏拉出来,方便调试。
4.Breakpoints(F9)
用Alt+F9可以对所有的断点进行编辑。

对指令地址(EIP)指定断点
当EIP的值为指定值时中断。如下图:是对SetWindowLong的地址进行设置的(注意:一定要在前面加0x)。

对内存地址设置断点
当指定内存地址发生变化时中断(在运行时设置才管用)。
5.Show Next Statement(Alt+Num *)
显示当前指令所处的代码位置
6.Step Over(F10)
单步追踪,遇到Call语句不进入
7.Step Into(F11)
单步追踪,遇到Call语句进入
8.Step Out(Shift+F11)
跳出当前函数调用
9.Run to Cursor(Ctrl+F10)
运行到光标所处位置
10.Memory Leaks
内存泄漏。要想检查到memory leaks,必须包含头文件(实际上是#pragma comment(lib, "mfc42ud.lib")在起作用)。
注意:内存泄漏是一个十分严重的问题,尤其对于需要长时间运行的程序(进程长时间保留在内存中)更是如此。有一个重要的事实是,当进程正常退出时,操作系统负责清空该进程的所有内存。
11.QuickWatch(Shift+F9)
可以更改变量运行时的值。
12.Watch窗口
输入"err,hr"可以动态查看GetLastError信息。可以输入寄存器。
(long *)ESP可以查看堆栈内容。 
13.Variables窗口
当前函数的局部变量
14.Registers窗口
EIP、ESP、ECX
15.Memory窗口
对变量可以拖放。Options->Debug中可以设置
16.Call Stack窗口

17.Disassembly窗口
Set next statement 跳过某些语句(有时用于Hack)

Goto Source

Ctrl+G

在%system%目录下创建de.bat文件,内容如下:
dumpbin /exports %1>a.txt
a.txt
对dll输出函数进行查看

Apply Code Changes(Alt+F10)
当处于Debugging状态时,如果更改了代码,可以执行此命令,可以使得重新编译后再运行到当前状态。
18.Debug->Modules窗口

19.Profile(Build菜单下)
要先设置Project -> Settings -> Link -> Enable profiling
20.ASSERT,VERIFY
21.TRACE
在Debug状态下输出,同时要求Enable tracing开启。
22.AfxMessageBox
23.cout,printf
对控制台程序进行输出测试
24.OutputDebugString
在Debug和Release状态下都可以输出。
25.DebugBreak,_asm{int 3}
强制中断
26.如何对Release版本进行Debug
进行如下设置,然后就可以进行Debug了。

Settings -> C/C++ -> Category(General) -> Debug info=Program Database 
Settings -> Link -> Category(General) -> Generate debug info=true 
27.输出汇编文件
Project Settings中如下设置:

 则会产生相应的汇编文件 (*.asm / *.cod)
28.在Win32程序中输出字符串到控制台
if (AllocConsole())
{
HANDLE hConsole;
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (hConsole)
{
DWORD dwWritten;
char sOut[]="This is a test string.\n";
WriteConsole(hConsole, sOut, strlen(sOut), &dwWritten, NULL);
}
}
//FreeConsole();    

以上就介绍了VC/MFC的学习,希望对VC/MFC有兴趣的朋友有所帮助。了解更多内容,请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程