(NTDLL.DLL): 0xC0000005: Access Violation.解决办法
(NTDLL.DLL): 0xC0000005: Access Violation.
1秒钟大概可以创建10个左右的线程执行EPCProcessThread,在DEBUG状态下一两分钟将出现Access Violation的报错。运行态不会报错。求解,为什么要跑一会才会出错?应该怎么解决?
------解决思路----------------------
是不是内存消耗太多引起的!跑起来后,看看内存使用情况!
------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533
1秒钟大概可以创建10个左右的线程执行EPCProcessThread,在DEBUG状态下一两分钟将出现Access Violation的报错。运行态不会报错。求解,为什么要跑一会才会出错?应该怎么解决?
struct StTagInfo
{
unsigned char AntennaPort;
unsigned char Channel;
short RSSI;
unsigned char EpcLen;
unsigned char EPC[MAX_EPC_LEN+1];
};
struct StTagInfoGroup
{
int TagCnt;
StTagInfo* p_StTagInfo;
};
static void ReportDataEvent()
{
/*缓冲有数据,并且超时或者缓冲将满时把数据给出去*/
if((gp_StTagInfo - gp_StTagInfoCopy > 0) &&
((timeGetTime() - g_LastTagGetTime >= TAG_REPORT_INTERVAL_TIME)
|| (gp_StTagInfo == gp_StTagInfoCopy + TAG_BUFFER_SIZE - 1)))
{
HANDLE EPCProcessThreadHandle;
DWORD EPCProcessThreadId;
//对外传递数据的接口
StTagInfoGroup* StTagGroup = new StTagInfoGroup();/*delete对象StTagInfoGroup:新建*/
if(StTagGroup == NULL)
{
return;
}
StTagGroup->TagCnt = gp_StTagInfo - gp_StTagInfoCopy;
StTagGroup->p_StTagInfo = gp_StTagInfoCopy;
/*创建线程将标签信息给出去处理*/
EPCProcessThreadHandle = CreateThread(
NULL, // default security attributes
0, // use default stack size
EPCProcessThread, // thread function
StTagGroup, // argument to thread function
0, // use default creation flags
&EPCProcessThreadId);
gp_StTagInfo = NULL;
gp_StTagInfoCopy = NULL;
}
}
static void EPCProcess(CsA6Package* package)
{
//出现异常或命令结束包返回
if ((package->timeout_status != EXEC_SUCCESS) ||
(package->DataLenght < INV_MIN_DATA_LEN) ||
(package->Cmd != CMD_INVENTORY))
{
return;
}
else
{
unsigned short PC = ((unsigned short)package->Data[INV_PC_H_OFF] << 8) | package->Data[INV_PC_L_OFF];//PC
unsigned char EPCLength = GetPureEPCLen(PC);//EPC长度
if (INV_DATA_LEN(EPCLength) == package->DataLenght)
{
ReportDataEvent();
if(gp_StTagInfo == NULL)
{
gp_StTagInfo = new StTagInfo[TAG_BUFFER_SIZE];/*delete对象StTagInfo数组:新建*/
if(gp_StTagInfo == NULL)
{
return;
}
gp_StTagInfoCopy = gp_StTagInfo;
g_LastTagGetTime = timeGetTime();
}
if(gp_StTagInfo - gp_StTagInfoCopy >= TAG_BUFFER_SIZE - 1)
{
return;
}
StTagInfo* TagInfo = gp_StTagInfo++;
TagInfo->AntennaPort = package->Data[INV_ANT_OFF];//天线端口
TagInfo->Channel = package->Data[INV_CHAN_OFF]; //信道
TagInfo->RSSI = ((short)package->Data[INV_RSSI_H_OFF] << 8) | package->Data[INV_RSSI_L_OFF];//RSSI
TagInfo->EpcLen = EPCLength;
memcpy(TagInfo->EPC, package->Data+INV_EPC_OFF, TagInfo->EpcLen);
}
}
}
static DWORD WINAPI EPCProcessThread(LPVOID lpParam)
{
StTagInfoGroup* TagGroup = (StTagInfoGroup*)lpParam;
if(TagGroup != NULL)
{
/*给应用程序处理标签信息*/
if(gp_TagReportHandle != NULL)
{
gp_TagReportHandle(*TagGroup);
}
/*释放内存*/
delete[] TagGroup->p_StTagInfo;/*delete对象StTagInfo数组:释放*/
TagGroup->p_StTagInfo = NULL;
delete TagGroup;/*delete对象StTagInfoGroup:释放*/
/*似乎在这个地方会出现First-chance exception in **.exe (NTDLL.DLL): 0xC0000005: Access Violation.*/
TagGroup = NULL;
}
return NULL;
}
------解决思路----------------------
是不是内存消耗太多引起的!跑起来后,看看内存使用情况!
------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533