多线程应用程序在发布模式下崩溃

时间:2010-03-31 09:48:04

标签: c multithreading visual-c++

我正在使用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中使用以下文件“ 我并不熟悉我使用过的样本(效果很好)并在其上构建。 我在论坛上看到了一个类似的问题,但由于我不熟悉线程,所以我并不理解答案。 有人能帮我吗? 感谢

2 个答案:

答案 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); 它是在正在运行的线程中编写的。 我不知道为什么在这部分代码崩溃