C++ 调试glibc free():指针无效

C++ 调试glibc free():指针无效,c++,glibc,coredump,invalid-pointer,C++,Glibc,Coredump,Invalid Pointer,我试图调试最终抛出的代码 *** glibc detected *** ./build/smonitor: free(): invalid pointer: 这很有挑战性,因为我不使用免费的。。。我已经看到了其他SO帖子,它们都有复制这个问题的例子。。我需要关于如何调试的帮助。首先,我是一名C/C++n00b,所以我的指针技能正在开发中,但我没有做太多的动态内存分配(我想) 我开始编写自己的“安全”应用程序,从相机中获取快照并将其写入NFS共享,最终将显示每个相机的快照。现在,我从一台相机上拍

我试图调试最终抛出的代码

*** glibc detected *** ./build/smonitor: free(): invalid pointer:
这很有挑战性,因为我不使用免费的。。。我已经看到了其他SO帖子,它们都有复制这个问题的例子。。我需要关于如何调试的帮助。首先,我是一名C/C++n00b,所以我的指针技能正在开发中,但我没有做太多的动态内存分配(我想)

我开始编写自己的“安全”应用程序,从相机中获取快照并将其写入NFS共享,最终将显示每个相机的快照。现在,我从一台相机上拍摄照片,并在我的显示窗口中循环(使用opencv)。在我得到堆芯之前,我可以跑一段时间(~小时)。我创建了一个线程来运行窗口,我应该循环,直到我的run标志设置为false,然后调用cvReleaseImage。。我不知道为什么会失败,非常感谢您的指导

// will be replaced with camera X filename on NFS share
std::string generate_filename() 
{
    static const char alphanum[] =
                "0123456789"
                "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                "abcdefghijklmnopqrstuvwxyz";

    std::string filename = "";
    std::stringstream ss;
    for (int i = 0; i < 10; i++)
    {
        ss << alphanum[rand() % (sizeof(alphanum) - 1)];
    }
    ss << ".jpg";
    printf("Generated filename: %s\n", ss.str().c_str());
    return ss.str();
}

std::string generate_file_path()
{
    std::stringstream ss;

    ss << CAPTURES_PATH << generate_filename();
    return ss.str();
}


void capture_photo(std::string& filepath)
{
    time_t now;
    time_t end;
    double seconds;
    bool cancelCapture = false;
    int count = 0;

    CvCapture* capture = cvCreateCameraCapture(0);
    printf(“Opened camera capture\n");
    IplImage* frame;
    while(1)
    {
        frame = cvQueryFrame(capture);
        if (!frame)
        {
            fprintf(stderr, "Could not read frame from video stream\n\n");
        } else
        {
            cvShowImage(WINDOW, frame);
            cvWaitKey(100);
            if (get_snapshot_enabled()) // simulate delay between snapshots
            {
                filepath = generate_file_path();
                printf("Saving image\n");
                cvSaveImage(filepath.c_str(), frame);
                break;
            }
        }
    }
    printf("Ending camera capture\n");
    cvReleaseCapture(&capture);
}

void* manage_window(void* arg)
{
    time_t now;
    time_t end;
    double seconds = 0;
    double stateSec;

    int i = 0;
    int rem = 0;

    IplImage* images[10];

    time_t lastUpdate;
    time_t tDiff; // time diff

    cvNamedWindow(WINDOW, CV_WINDOW_FREERATIO);
    cvSetWindowProperty(WINDOW, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);

    std::string filepath;
    time(&now);
    int lastPos = 0;
    while (1)
    {
        if (get_snapshot_enabled())
        {
            write_console_log("Going to capture photo\n");
            // camera was selected
            filepath = generate_file_path();
            printf("Generated filepath: %s\n", filepath.c_str());
            capture_photo(filepath);

            if (!filepath.empty())
            {
                printf("Received filepath: %s\n", filepath.c_str());
                time(&now);

                images[lastPos] = cvLoadImage(filepath.c_str());
                cvShowImage(WINDOW, images[lastPos]);
                cvWaitKey(100);
                if (lastPos == 10) lastPos = 0;
                else lastPos++;
            } 
        }

        time(&end);
        seconds = difftime(end, now);
        if (seconds >= 5)
        {
            cvShowImage(WINDOW, images[ i % 10])
            cvWaitKey(100);

            i++;
            time(&now);
        }

        // check if we're running
        if (!get_running())
        {
            // log some error we're not running...
            write_logs("Window thread exiting, not running...");
            break;
        }
    }

    for (i=0; i < 10; i++)
        cvReleaseImage(&images[i]);

    pthread_exit(NULL);
}
//将替换为NFS共享上的camera X文件名
std::字符串生成_文件名()
{
静态常量字符alphanum[]=
"0123456789"
“ABCDEFGHIJKLMNOPQRSTUVWXYZ”
“abcdefghijklmnopqrstuvwxyz”;
std::string filename=“”;
std::stringstream-ss;
对于(int i=0;i<10;i++)
{

ss在
void*manage_窗口(void*arg)
中有行

IplImage* images[10];

其中,
lastPos
可以增加到10,导致

images[10] = cvLoadImage(filepath.c_str());

i、 e.数组末尾之外的写入无效。我想类似的东西会检测到这一点。

如果您使用的是
C++
,请不要标记
C
。您是否在开发环境的调试器下运行了您的程序?应该可以帮助您缩小坏
空闲
发生的范围。这
if(lastPos==10)lastPos=0;否则lastPos++
似乎会导致
图像[10]=…
即数组末尾之外的无效写入。JJ是正确的,您可能实际上希望在检查结束之前增加1:
如果(++lastPos==10)lastPos=0;
(没有任何
否则…
)哦,伙计@J.J.Hakala,你说得对,那一个从我身边溜走了…为什么应用程序没有更早崩溃?在尝试Valgrind之前,试一试。它运行速度快得多,并且捕获了大多数相同的bug。当然,Valgrind仍然是这类事情的黄金标准。
images[10] = cvLoadImage(filepath.c_str());