我正在使用Visual Studio 2008(在c中编程)。 我有一个奇怪的问题,我有一个程序,它有两个同时运行的线程,一个记录线程(使用声卡记录到内存中)和一个翻译线程(使用语音引擎识别单词)。当我在调试模式下运行我的程序时(也就是在代码中设置一个断点)它运行得很好,但是当我在调试模式或发布模式下运行时(在visual studio环境之外),它会崩溃并给我以下异常: “LowLevel.exe中0x7c911129处的未处理异常:0xC0000005:访问冲突读取位置0x014c7245。” 我的堆栈看起来:
LowLevel.exe!__ set_flsgetvalue()行 256 + 0xc字节C
LowLevel.exe!_isleadbyte_l(INT c = 4359676,localeinfo_struct * locinfo = 0x00000001)第57行C ++ LowLevel.exe!PlayDateOfExam(INT option = 1)2240行+ 0x7字节C ++ LowLevel.exe!NSCThread(void * arg = 0x00000000)行1585 + 0xb bytes C ++ kernel32.dll!7c80b729()
WINMM.DLL!76b5b294()
我在项目“nsc.lib”和WinMM.lib中使用以下文件“ 我并不熟悉我使用过的样本(效果很好)并在其上构建。 我在论坛上看到了一个类似的问题,但由于我不熟悉线程,所以我并不理解答案。 有人能帮我吗? 感谢
答案 0 :(得分:0)
如果问题仅在未在调试器下运行时出现,则可能与时序相关。在PlayDateOfExam()中查看被引用的变量,并确定哪一个也可能被另一个线程搞乱。
(例如)另一个线程可能会弄乱数组的长度。在调试器下,时间是这样的,你可以在另一个线程触及它之前引用该长度,一切都很好。在调试器之外,当引用该数组长度时,它已经被搞砸了,并且最终会在数组的边界上运行。 无法确定实际问题是什么,因为没有足够的信息,但这就是您正在寻找的问题。
答案 1 :(得分:0)
我认为就像你说的那样,问题就是PlayDateOfExam,因为我在我的代码中调用了这个函数,所以这让我感到很惊讶。 功能代码是:
char* PlayDateOfExam(int option)
{
char* WaveFileName;
if (option==1)
{
int k=atoi(Global_Input.day);
if (atoi(Global_Input.day)<10)
{
int day=atoi(Global_Input.day);
day=day % 10;
char* day_s=(char*)malloc(sizeof(char)*2);
_itoa(day,day_s,10);
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
strcat(WaveFileName,day_s);
return (WaveFileName);
}
else
{
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
strcat(WaveFileName,Global_Input.day);
return (WaveFileName);
}
}
else if (option==2)
{
int k=atoi(Global_Input.month);
if (atoi(Global_Input.month)<10)
{
int month=atoi(Global_Input.month);
month=month % 10;
char* month_s=(char*)malloc(sizeof(char)*2);
_itoa(month,month_s,10);
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\");
strcat(WaveFileName,month_s);
return (WaveFileName);
}
else
{
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\");
strcat(WaveFileName,Global_Input.month);
return (WaveFileName);
}
}
else if (option==3)
{
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exams Dates Files\\");
strcat(WaveFileName,"2000+");
return(WaveFileName);
}
else if (option==4)
{
int k=atoi(Global_Input.hour);
if (atoi(Global_Input.hour)<10)
{
int hour=atoi(Global_Input.hour);
hour=hour % 10;
char* hour_s=(char*)malloc(sizeof(char)*2);
_itoa(hour,hour_s,10);
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
strcat(WaveFileName,hour_s);
return (WaveFileName);
}
else
{
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
strcat(WaveFileName,Global_Input.hour);
return (WaveFileName);
}
}
else if (option==5)
{
int k=atoi(Global_Input.minute);
if (atoi(Global_Input.minute)<10)
{
int minute=atoi(Global_Input.minute);
minute=minute % 10;
char* minute_s=(char*)malloc(sizeof(char)*2);
_itoa(minute,minute_s,10);
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
strcat(WaveFileName,minute_s);
return (WaveFileName);
}
else
{
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Grades Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Grades Files\\");
strcat(WaveFileName,Global_Input.minute);
return (WaveFileName);
}
}
else if (option==6)
{
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exam Locations Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exam Locations Files\\");
strcat(WaveFileName,Global_Input.class_location);
return (WaveFileName);
}
else if (option==7)
{
WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Exam Locations Files\\"));
strcpy(WaveFileName,"\\LowLevel_ASR\\Wave Files\\Exam Locations Files\\");
strcat(WaveFileName,Global_Input.class_number);
return (WaveFileName);
}
return ("Error");
}
对该功能的调用是: sndPlaySound(PlayDateOfExam(4),SND_SYNC); 它是在正在运行的线程中编写的。 我不知道为什么在这部分代码崩溃