C实例编程(VC调试:两个有个性的bug)

C实例编程(VC调试:两个有个性的bug),第1张

C实例编程(VC调试:两个有个性的bug),第2张

昨天我用VC调试cnbook的时候遇到了两个个别Bug:
Bug 1只在直接运行发布版的时候出现,但是调试版和带F5的发布版都不会出现。
bug2仅在使用F5运行调试版本时出现,而在直接运行发布版本时不会出现。
1 bug1及发布版本调试
此bug无法调试。我通过打印来调试它。对于GUI程序,只需将打印输出发送到另一个窗口。附录1介绍了我常用的GUI程序打印方法。
通过逐步增加打印,我发现问题是由一个以零结尾的字符串参数引起的。如果结尾的零后面跟一个非零值,就不会出错。如果结尾的零后面跟零,就会出现错误,直接运行发布版本就会出现这种情况。
发现问题原因后,我就可以使用调试器了。调试调试版本,在输入参数前中断,将结束零后的数据改为0。然后,您可以在调试器中跟踪运行。终于找到了一个不判断字符串已经结束的函数。只是补充一个判断。
2 bug2
bug2出现在调试中很容易调整。这个bug很简单:我有一个函数,它需要一个以零结尾的C字符串。但是在我调用的一些地方,传入的字符串没有以零结尾,导致读取的数据越界。在发布版本中,字符串后面可能有零个字符,没有问题。在调试版本中,长字符串后面没有零字符,所以有问题。
3结论
VC调试的另一个神奇bug是在调试状态下弹出用户断点的提示,我遇到过几次。这是由于写出界和销毁堆数据造成的。解决方法请参考《灭门十二记:NTDLL莫名断点》。
其实不管有没有暴露,虫子都是一直存在的,就像太阳无论晴天下雨都是一直存在的一样。考试。大提示解决所有bug的方法就是开发的时候多加小心,不要让它们出现。
附录1 GUI程序的打印与调试
我写过一个叫MsgWin的小程序,可以显示WM_COPYDATA消息中的打印文本。在MsgWin中选择工具->窗口名称->打印窗口,将MsgWin的窗口名称设置为打印窗口。然后使用FindWindow在被调试的程序中找到名为“打印窗口”的窗口,通过WM_COPYDATA消息将打印输出发送给它。
WM _ copy data消息的LPARAM参数的数据结构定义如下:
typedef struct COPYDATASTRUCT {
dword dw data;
DWORD CB data;
PV oid LP data;
} COPYDATASTRUCT,* PCOPYDATASTRUCT
cbData是以字节为单位的数据长度。LpData是一个数据指针。WM_COPYDATA消息必须和SendMessage同步发送,所以指针指向的数据只要SendMessage被调用就有效。MsgWin支持消息级以及ANSI编码或Unicode编码的文本。这些信息都是通过dwData传递的:
小于10的dwData表示ANSI文本,dwData的值为消息级;
大于或等于10的dwData表示Unicode文本,dwData-10的值是消息级别。
整理出了一个压缩包,包括MsgWin,MsgWin源程序和放置在调试对象中的打印代码。打印代码有ANSI和UNICODE两种版本。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C实例编程(VC调试:两个有个性的bug)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情