赞
踩
程序被中断下来后,调试器附加上去,发现调用栈是在调用窗口过程时候中断的,当前的消息是WM_PAINT,其他线索没有,如果继续运行就导致进程退掉了,尝试直接从vs环境调试运行也是同样的结果,但是在Output面板发现的报告了 STATUS_STACK_BUFFER_OVERRUN 字面理解就是栈溢出了,WM_PAINT消息处理时候和栈溢出有啥关系呢,通过窗口句柄找到对应的控件类型和id,到工程搜了一遍,发现有一个listview控件的定制类在,但该类根本没有响应WM_PAINT消息,都是系统默认在画,在看看消息映射部分,发现用的是虚拟列表形式,那就好办了,我对这个消息是有印象的,知道其中的系统缓冲区长度是有限制的,我心想答案已经有了,直接定位到系统回调LVN_GETDISPINFO的响应函数时候,发现真的是粗暴的用lstrcpy来拷贝字符串到系统缓冲区,那解决办法就是wcsncpy_s(pItem->pszText, 260, msgItem.strRecvNames, _TRUNCATE);虽然问题是解决了,但是还没有找到一种办法直接定位到当时栈溢出时候的调用栈,有点郁闷。
参考:
http://msdn.microsoft.com/en-us/library/windows/desktop/bb774760(v=vs.85).aspx
http://msdn.microsoft.com/zh-cn/magazine/cc163311.aspx#S4
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。