上周晓雯在调试一个新的线程的时候,出现了一个非常奇怪的问题,如下:
1:在FaAPI.cpp中调用了新线程函数
NewThread(SmartChgMThread, NULL, 8192, THREAD_PRIORITY_NORMAL);
2:在Proto目录下有SmartChg目录,有文件如下:
其中SmartChgMThread在文件SmartChgCtl.cpp文件中,线程代码如下:
正常程序运行的时候,执行顺序应该是1——2——3,但VS调试的时候,首先直接到了SmartchgPileInit()函数的断定(并不是通过SmartChgMThread的调用接口,而是new线程后,直接在SmartchgPileInit()函数中的断点停下来的),在n=1这个地方的断点不会执行。直接运行也会打印调试信息。
可能的问题分析:
1:是否程序代码溢出导致的,因为直接执行的,还没有到内存分配的步骤——排除
2:是否内存结构体对齐导致的,查看所有的#pragma pack(1)和#pragma pack(),都是配对使用的,没有遗漏, 也不存在结构体中,是否非基本变量类型的(如使用string)——排除
3:工程配置问题,查看工程属性,查看优化等级、平台工具集、常规(附加目录),都未见异常
4:是否是断点和实际代码错位呢(如果代码优化了,就可能哦),查找
确定不会错位哦。
5:迁移代码调试,将上述的TThreadRet SmartChgMThread(void* pvPara)函数放到FaAPI.cpp中,运行断点调试——能按照正常顺序运行——有点奇怪啊
6:将代码迁移到ProAPI.cpp文件中执行,也能按照正常流程运行,但实际调试的时候,又有个问题:
都已经return false,代码并不直接返回,而是到:
经过分析,应该还是代码错位的问题,查找相关资料,找到一篇关于代码错位的文章(关于VS(Debug模式)调试代码遇到的代码错位问题_离歌漠的博客-CSDN博客)
对于windows有4种编码格式:
ANSI:系统预设的标准文字储存格式。ANSI专为电脑工业建立标准,它是世界上相当重要的标准。
Unicode:世界上所有主要指令文件的联集,包括商业和个人电脑所使用的公用字集。当采用Unicode格式储存文件时,可使用Unicode控制字符辅助说明语言的文字覆盖范围,如阿拉伯语、希伯来语。用户在“记事本”中输入含有Unicode字符的文字并储存文件时,系统会提示你必须选取“另存为”中的Unicode编码,这些字符才不会被遗失。需要提醒大家的是,部分Windows 2000字型无法显示所有的Unicode字符。如果发现文件中缺少了某些字符,只需将其变更为其它字型即可。
Unicode big endian:在Big-endian处理器(如苹果Macintosh电脑)上建立的Unicode文件中的文字位元组(存放单位)排列顺序,与在Intel处理器上建立的文件的文字位元组排列顺序相反。最重要的位元组拥有最低的地址,且会先储存文字中较大的一端。为使这类电脑的用户能够存取你的文件,可选择Unicode big-endian格式。
UTF-8:UTF意为通用字集转换格式(Universal Character Set Transformation
Format),UTF-8是Unicode的8位元格式。如果使用只能在同类位元组内支持8个位元的重要资料一类的旧式传输媒体,可选择UTF-8格式。
其中VS下一般默认使用的是ANSI格式,尤其对于中文。
对于错位,可能是格式问题导致的,文件->高级保存选项,出现如下框
如上,最重要是对于下面的Windows的配置,配置完成后,重新编译,就可以正常调试了。
总结:在VS调试的时候,不能随意修改或调整编码格式和换行方式,否则可能导致调试代码的时候,代码错位的问题。
同时,对于代码调试异常的查找问题方式,大家在后面的VS调试中,可以参照。