c++ - 除非在调试器中逐步执行,否则函数调用会导致 C++ 程序卡住

标签 c++ debugging freeze flycapture

我有这个简短的 C++ 程序,它循环从相机中获取快照图像并显示它们:

void GenericPGRTest::execute()
{
    // connect camera
    Camera *cam = Camera::Connect();

    // query resolution and create view window
    const Resolution res = cam->GetResolution();
    cv::namedWindow("View");

    c = 0;
    // keep taking snapshots until escape hit
    while (c != 27)
    {
        const uchar *buf = cam->SnapshotMono();
        // create image from buffer and display it
        cv::Mat image(res.height, res.width, CV_8UC1, (void*)buf);
        cv::imshow("Camera", image);
        c = cv::waitKey(1000);
    }
}

这使用一个类 (Camera) 来控制我使用 Point Grey SDK 创建的相机控制和 OpenCV 库中的函数来显示图像。我不一定要寻找与这两个库中的任何一个的使用相关的答案,而是寻找关于如何调试一般奇怪问题的一些见解。问题是应用程序在 cam->SnapshotMono() 行卡住(不是崩溃)。当然,我用调试器运行了这个函数。内容如下:

const uchar* Camera::SnapshotMono()
{
    cam_.StartCapture();
    // get a frame
    Image image;
    cam_.RetrieveBuffer(&image);
    cam_.StopCapture();

    grey_buffer_.DeepCopy(&image);
    return grey_buffer_.GetData();
}

现在,每次我在调试器中逐步执行函数时,一切正常。但是我第一次执行“跳过”而不是“进入”SnapshotMono() 时,砰的一声,程序卡住了。当我当时暂停它时,我注意到它卡在 SnapshotMono() 中的 RetrieveBuffer() 行。我知道这是一个阻塞调用,所以理论上它可以卡住(不知道为什么,但这是可能的),但为什么它在正常运行时阻塞而不是在调试时阻塞?这是迄今为止我在调试中看到的最奇怪的行为之一。知道为什么会发生这种情况吗?

对于那些熟悉 FlyCapture 的人来说,上面的代码不会按原样中断,而是只有当我在回调模式下使用 StartCapture(),然后用 StopCapture()< 终止它时才会中断/em> 在它之前。

使用 MSVC2010、OpenCV 2.4.5 和 PGR FlyCapture 2.4R10 编译。

最佳答案

大胆的猜测......但可能是 StartCapture 已经开始了这个过程 最终在 ìmage 中拥有缓冲区,如果你离开它一些 到达 RetrieveBuffer 之前的时间。如果你一次运行它,情况就不是这样了......

关于c++ - 除非在调试器中逐步执行,否则函数调用会导致 C++ 程序卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18520662/

相关文章:

c++ - 如何修复在我的代码的特定部分抛出的异常?

c++ - 如何修复采用类成员相对顺序的奇怪 C++ 代码

c++ - 在 Windows 中调试堆栈溢出?

c - 在 Windows x64 上调试 C 故障转储

java - 在 Eclipse 中调试简单的 Dropwizard 应用程序

java - LWJGL grabbed mouse - 如果应用程序挂起或使用抓取的鼠标命中断点时进行调试

iphone - 模拟器在 arc4random-method 中卡住

c++ - 未定义对 'vtable for class' 构造函数的引用

c++ - 如何正确扩展这个宏?

android - 应用程序在调试时卡住