出现Stack Overflow是什么原因(菜鸟提问)?
我用VC6.0做了一个activeX控件,实现对USB设备的访问,VB6.0来调用这个控件,在VC的DEBUG版本下调试,程序开始运行正常,在调试信息中也没有发现内存泄露,但程序运行一段时间后,就出现错误First-chance exception in 工程1.exe (USP10.DLL): 0xC00000FD: Stack Overflow.
First-chance exception in 工程1.exe (KERNEL32.DLL): 0xC000008F: Float Inexact Result.
First-chance exception in 工程1.exe (NTDLL.DLL): 0xC0000005: Access Violation.
我的流程是:VB调用OCX的一个函数(ReadCmd),然后在VC中开启一个线程(AfxBeginThread)读取USB的数据,然后VB在调用OCX的另一个函数(GetData),等待线程结束,然后Fire出USB的数据。再重复这个过程,等这个过程循环多次运行后(496次),就出现上面的错误。主要代码如下:
//读USB数据
void CMyusbCtrl::ReadCmd(short EP)
{
// TODO: Add your dispatch handler code here
//bLooping=true;
myxfer=512;
EP3Count=0;
EP5Count=0;
UseData1=true;
UseData2=false;
XferThread1= AfxBeginThread(XferLoop1, this);
}
void CMyusbCtrl::GetData()
{
// TODO: Add your dispatch handler code here
while(XferThread1);
long *kk1=(long*)&inData1;
long *kk2=(long*)&inData2;
FireIndata(kk1,kk2,EP3Count,EP5Count);
}
UINT XferLoop1( LPVOID params ) {
CMyusbCtrl *dlg= (CMyusbCtrl *) params;
bool success;
int i;
long tmpcount=0;
int LastPipe;
CCyUSBDevice *myUSBDevice;
myUSBDevice= new CCyUSBDevice;
myUSBDevice-> Open(0);
CCyUSBEndPoint *myInEndpt;
long xfer = 65536;
bool Looping;
Looping = true;
LastPipe = 3;
dlg-> BReceiveData = false;
BHaveData = false;
long mxfer = 512;
ZeroMemory(dlg-> inData,sizeof(UCHAR)*mxfer);
ZeroMemory(dlg-> inData1,sizeof(UCHAR)*xfer);
ZeroMemory(dlg-> inData2,sizeof(UCHAR)*xfer);
//两个通道轮流使用
if (dlg-> Pipe1Start)
myInEndpt=myUSBDevice-> EndPoints[3];
else
myInEndpt=myUSBDevice-> EndPoints[5];
myInEndpt-> TimeOut =1000;
for (;Looping;)
{
//*******************************************************
success=myInEndpt-> XferData(dlg-> inData,mxfer);
Looping=success;
if (success)
{
for (i=0;i <512;i++)
{
if (tmpcount==65536)
{
dlg-> UseData1=false;
dlg-> UseData2=true;
dlg-> EP3Count=0;
}
if (dlg-> UseData1)
{
dlg-> inData1[tmpcount] = dlg-> inData[i];
tmpcount++;
}
if (dlg-> UseData2)
{
dlg-> inData2[tmpcount] = dlg-> inData[i];
tmpcount++;
}
}
}
//***************************************************************
}
dlg-> BReceiveData = true;
if (dlg-> Pipe1Start)
dlg-> Pipe1Start=false;
else
dlg-> Pipe1Start=true;
delete [] inData;
myUSBDevice-> Close();
delete myUSBDevice;
dlg-> EP3Count =tmpcount;
dlg-> XferThread1= NULL;
return true;
} --------------------编程问答-------------------- 一般是因为无法结束循环或者递归 --------------------编程问答-------------------- 很简单,主要原因有两种,一种是程序访问了非法地址,另一种是程序的Stack不够用了
--------------------编程问答--------------------
jinjazz:
我没有递归调用啊,循环也不会无法结束
lizhizhe2000:
很简单,主要原因有两种,一种是程序访问了非法地址,另一种是程序的Stack不够用了
**********************
访问了非法地址,但我无法跟踪到底是哪里访问了非法地址,因为一次流程没有出错,只有在运行了较长时间后才会出错,我也曾经将STACK改成10M,但结果依然是这样。 --------------------编程问答-------------------- 我劝你贴到VC 板块! --------------------编程问答-------------------- 楼主貌似发错地方了, HOHO~~ --------------------编程问答-------------------- 我在VC板块也发了相同的贴子,但没多少人,希望这边人多,给点意见。 --------------------编程问答-------------------- 写的很明确,栈溢出 --------------------编程问答-------------------- VC的问题最好在那边问吧,这边能够得到正确答案的效率可能会更低。栈溢出的话,一般都是因为循环层次过多吧,包括无终止的循环。 --------------------编程问答-------------------- 一个堆栈溢出的问题都能搞这么久,设个断点1分钟都不用就知道原因了,你的一堆代码没有人愿意抠着研究的 --------------------编程问答-------------------- dlg->inData[]; 变量长度为512,dlg->inData1变量长度为65536,我要将每次dlg->inData的数据放入dlg->inData1中,有没有更好的办法,我怀疑这个地方有问题。 --------------------编程问答-------------------- 楼主是不是应该去查一下,有没有用0做被除数的~~ --------------------编程问答-------------------- 没有除操作啊 --------------------编程问答-------------------- 高手呢,都到哪里去了? --------------------编程问答-------------------- :jinjazz
一个堆栈溢出的问题都能搞这么久,设个断点1分钟都不用就知道原因了,你的一堆代码没有人愿意抠着研究的
*************************************************************************************
要是向你说的设个断点1分钟都不用就知道原因了,我就不发帖了,我是程序连续运行了很长时间后才会出错,单独跑一遍,根本没发现什么问题。你不愿意抠,那是你自己的事。 --------------------编程问答-------------------- 我想你是不是缺少内存释放程序,刚开始运行内存充足,到后面内存占用的越来越多没释放啊。
补充:.NET技术 , ASP.NET