当前位置:编程学习 > C#/ASP.NET >>

出现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
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,