Run-Time Check Failure #2 - Stack around the variable 'm_osWrite' was corrupted

thundersung 2014-02-25 02:38:49
以下是菜鸟的向串口写字符串的函数

void ProcessSndBuffer(BYTE *buffer, DWORD size, int comIndex)
{
try
{
OVERLAPPED m_osWrite;
memset(&m_osWrite, 0, sizeof(m_osWrite));
m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
COMSTAT ComStat;
DWORD dwErrorFlags, dwBytesWritten, dwRes;
BOOL bWriteStat;
ClearCommError(hComArray[comIndex], &dwErrorFlags, &ComStat);
bWriteStat = WriteFile(hComArray[comIndex], buffer, size, &dwBytesWritten, &m_osWrite);
if(!bWriteStat)
{
DWORD dwLastError = GetLastError();
if(GetLastError() == ERROR_IO_PENDING)
{
dwRes = WaitForSingleObject(m_osWrite.hEvent, 1000);
if (dwRes == WAIT_OBJECT_0)
{
while(!GetOverlappedResult(hComArray[comIndex], &m_osWrite, &dwBytesWritten, TRUE))
{
DWORD dwError = GetLastError();
if (dwError == ERROR_IO_INCOMPLETE)
continue;
}
}
}
}
CloseHandle(m_osWrite.hEvent);
}
catch (...)
{
}
}


然后运行一会儿就报错退出:Run-Time Check Failure #2 - Stack around the variable 'm_osWrite' was corrupted
好吧,引起这个错误的可能是别的地方内存操作越界引起的,但是为虾米每次俺运行都是这里错呢?
另外俺把memset(&m_osWrite, 0, sizeof(m_osWrite));这句注释了它貌似就不报错了。。。只不过这样WriteFile会返回LastError参数错误。。。
...全文
184 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2014-02-26
  • 打赏
  • 举报
回复
我觉得你的问题可能根本不在这个函数中. 你把下面这些代码先注释起来. 再一步一步打开排除. ClearCommError(hComArray[comIndex], &dwErrorFlags, &ComStat); bWriteStat = WriteFile(hComArray[comIndex], buffer, size, &dwBytesWritten, &m_osWrite); if(!bWriteStat) { DWORD dwLastError = GetLastError(); if(GetLastError() == ERROR_IO_PENDING) { dwRes = WaitForSingleObject(m_osWrite.hEvent, 1000); if (dwRes == WAIT_OBJECT_0) { while(!GetOverlappedResult(hComArray[comIndex], &m_osWrite, &dwBytesWritten, TRUE)) { DWORD dwError = GetLastError(); if (dwError == ERROR_IO_INCOMPLETE) continue; } } } } CloseHandle(m_osWrite.hEvent);
thundersung 2014-02-26
  • 打赏
  • 举报
回复
问题大概找到了,另外一处定期写日志的函数,没有SeekToEnd就WriteString,把这句加上,目前程序还没挂。
thundersung 2014-02-26
  • 打赏
  • 举报
回复
别沉啊!!!
thundersung 2014-02-26
  • 打赏
  • 举报
回复
在所有尝试之前,今天关机重启后没修改啥代码就不死了。 但是。。。exe拿到另外一台机器上就死了。。。艹!!!
oyljerry 2014-02-25
  • 打赏
  • 举报
回复
ClearCommError(hComArray[comIndex], &dwErrorFlags, &ComStat); 会不会有越界等操作
thundersung 2014-02-25
  • 打赏
  • 举报
回复

void ProcessSndBuffer(BYTE *buffer, DWORD size, int comIndex)
{
	try
	{
		OVERLAPPED m_osWrite;
#if 1
		m_osWrite.hEvent = 0;
		m_osWrite.Internal = 0;
		m_osWrite.InternalHigh = 0;
		m_osWrite.Offset = 0;
		m_osWrite.OffsetHigh = 0;
#endif
		COMSTAT ComStat;
		DWORD dwErrorFlags, dwBytesWritten, dwRes;
		BOOL bWriteStat;
		//memset(&m_osWrite, 0, sizeof(m_osWrite));
		m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
		ClearCommError(hComArray[comIndex], &dwErrorFlags, &ComStat);
		bWriteStat = WriteFile(hComArray[comIndex], buffer, size, &dwBytesWritten, &m_osWrite);
		if(!bWriteStat)
		{
			DWORD dwLastError = GetLastError();
			if(GetLastError() == ERROR_IO_PENDING)
			{
				dwRes = WaitForSingleObject(m_osWrite.hEvent, 1000);
				if (dwRes == WAIT_OBJECT_0)
				{
					while(!GetOverlappedResult(hComArray[comIndex], &m_osWrite, &dwBytesWritten, TRUE))
					{
						DWORD dwError = GetLastError();
						if (dwError == ERROR_IO_INCOMPLETE)
							continue;
					}
				}
			}
		}
		CloseHandle(m_osWrite.hEvent);
	}
	catch (...)
	{
	}
}
不用memset,俺纯粹一个一个成员赋0,效果应该和memset一样了吧? 然后。。。就悲剧了!还是这个错误。。。
thundersung 2014-02-25
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
只不过这样WriteFile会返回LastError参数错误。。。 ----------------------------------------------- ??? 你的意思是这个 bWriteStat = WriteFile(hComArray[comIndex], buffer, size, &dwBytesWritten, &m_osWrite); 调用失败?GetLastError返回的错误是参数错误??
嗯,我用VS自带的错误查找工具是这么说的。 当时DEBUG发现如果不memset的话里面除了hEvent全都是0xcccccccc
Eleven 2014-02-25
  • 打赏
  • 举报
回复
只不过这样WriteFile会返回LastError参数错误。。。 ----------------------------------------------- ??? 你的意思是这个 bWriteStat = WriteFile(hComArray[comIndex], buffer, size, &dwBytesWritten, &m_osWrite); 调用失败?GetLastError返回的错误是参数错误??
1、课程简介          ElasticStack 是一系列开源产品的合集,包括 Elasticsearch、Kibana、Logstash 以及 Beats 等,能够安全可靠地获取任何来源、任何格式的数据,并且能够实时地对数据进行搜索、分析和可视化。其中,Logstash和Beats负责数据的收集,Kibana负责结果数据的可视化展现,Elasticsearch作为核心部分用于数据的分布式存储以及索引。   我们可以使用ElasticStack进行收集并处理任何数据,最为经典的是用于实时日志数据的收集、存储、展现。在此之前,如果实现实时日志的分析,需要经过繁琐的架构设计并且使用多个系统实现,现在只需要使用ElasticStack即可实现功能强大的实时日志分析系统,ElasticStack不仅仅用来做日志分析,它可以处理任何的数据并且进行存储、展现。          在本套课程中,我们将全面的讲解ElasticStack技术栈,从环境的部署到技术的应用,再到项目实战,让我们不仅是学习框架技术的使用,而且可以学习到使用ElasticStack如何解决实际的问题,我们通过收集系统日志数据、服务器指标数据、nginx的运行数据等,多维度的展示了ElasticStack的应用范围,最终将分析的结果数据非常友好的展现出来,没错!不需要前端的参与也可以做出“高大上”的结果显示页。   2、适应人群   有一定的Java基础,并且要有一定的web开发基础。   3、课程亮点          系统的学习ElasticStack技术栈,掌握最先进的搜索、数据收集等技术。   l  Elasticsearch   n  快速入门   n  核心详解   n  中文分词   n  Elasticsearch集群   n  Java客户端的应用   l  Beats & Kibana & Logstash   n  Filebeat(文件采集器)   n  Metricbeat(指标采集器)   n  采集Nginx的日志以及指标数据   n  Kibana自定义仪表盘   n  Logstash自定义数据处理   l  综合练习   n  收集APP产生的日志进行实时展现   n  Filebeat采集日志   n  Logstash处理数据   n  Kibana 自定义仪表盘展现   4、主讲内容   章节一:Elasticsearch入门   1.     快速入门   2.     核心讲解   3.     中文分词   4.     全文搜索   5.     Elasticsearch集群   章节二:Beats   1.     Beats 简介   2.     Filebeat采集Nginx日志   3.     Metricbeat采集Nginx指标数据   章节三:Kibana   1.     Kibana简介   2.     Metricbeat 仪表盘   3.     Nginx 指标仪表盘   4.     Nginx 日志仪表盘   5.     自定义图表   章节四:Logstash   1.     Logstash简介   2.     配置详解   3.     读取自定义日志   章节五:综合练习   1.     流程说明   2.     Filebeat采集日志   3.     Logstash处理数据   4.     Kibana 自定义仪表盘展现

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧