VS2015工程debug单步调试代码执行异常

上周晓雯在调试一个新的线程的时候,出现了一个非常奇怪的问题,如下:

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调试中,可以参照。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术的微光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值