【问题标题】:multi thread apps crashes in release mode多线程应用程序在发布模式下崩溃
【发布时间】:2010-03-31 09:48:03
【问题描述】:

我正在使用 Visual Studio 2008(用 c 编程)。 我有一个奇怪的问题,我编写了一个程序,它有 2 个同时运行的线程,一个录制线程(使用声卡录制到内存中)和一个翻译线程(使用语音引擎来识别单词)。当我在调试模式下运行我的程序时(也就是在代码中设置断点)它运行得很好,但是当我在调试模式或发布模式下运行时(在 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 字节 C++ kernel32.dll!7c80b729()
winmm.dll!76b5b294()

我在我的项目“nsc.lib”和 WinMM.lib 中使用了以下文件 我对使用示例(效果很好)并在其上构建的线程并不十分熟悉。 我在论坛上看到了一个类似的问题年,但由于我不熟悉线程,我并没有真正理解答案。 有人能帮我吗? 谢谢

【问题讨论】:

  • 根据这些信息,不可能帮助到你。即使您确实可以访问完整的源代码,也很难调试线程问题。
  • 数据不足。你有不明白的答案的链接吗?你有代码来演示这个问题吗?
  • _isleadbyte_l() 的参数是垃圾。 PlayDateOfExam() 出现问题,第 2240 行。
  • 我隔离了问题,当我在变量 WaveFileName=(char*)malloc(sizeof("\\LowLevel_ASR\\Wave Files\\Gra...跨度>

标签: c multithreading visual-c++


【解决方案1】:

如果问题仅在未在调试器下运行时出现,则很可能与时间有关。在 PlayDateOfExam() 中查看被引用的变量,并确定其中哪些变量也可能被另一个线程弄乱。

有可能(例如)另一个线程正在弄乱数组的长度。在调试器下,时间是这样的,你在另一个线程接触它之前引用那个长度,一切都很好。在调试器之外,当引用该数组长度时,它已经被搞砸了,您最终会超出数组的边界。 由于没有足够的信息,因此无法判断实际问题是什么,但这正是您要寻找的问题。

【讨论】:

    【解决方案2】:

    我认为就像您所说的那样,问题在于 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); 这是写在一个正在运行的线程中。 我不知道为什么在这段代码中它崩溃了

    【讨论】:

    • 您应该将其编辑到您的问题中,而不是将其作为答案发布。
    猜你喜欢
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2018-11-09
    • 2017-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多