2016-11-29 2 views
10

я построил OpenCV двоичные файлы (.dll) с использованием CMake & Visual Studio, который генерируется .pdb файл, который помог мне найти проблему в коде (частично!)Отладка в Visual Studio без PDB файлов (C++ Access Voilation)

Как эта ошибка вызывается. ,
Я использую программное обеспечение, с помощью которого мы можем установить ограничение скорости интернет-загрузки (скорость передачи) для любой конкретной программы.

Теперь, если я подключаю IP-камеру к коду ниже, я заметил, что моему приложению требуется около 100 Кбит/с использования Интернета (скорость передачи) - только тогда я могу без проблем наблюдать за потоком в прямом эфире. Скажем, я сократил (установил) использование моего приложения в Интернете до 10Kb/s [Это причина аварии] В этом случае я должен иметь возможность видеть новый кадр раз в 4+ секунд.

Ошибка доступа к ошибке, вероятно, потому что (cap>>img;) колпачок пытается достичь местоположения в баране & получить кадр, но нет кадра YET, потому что он все еще загружается из-за низкой скорости интернета.
Очевидно, что указатель достигает некоторого местоположения в ram, чтобы захватить рамку, которая еще не присутствует.

Некоторое интересное поведение. , ,

Void OpenCamera() 
{ 
    VideoCapture cap("http://192.168.1.3:8080/video?x.xmjpeg"); 
    Mat img; 
    while(true) 
    { 
     try 
     { 
     if(cap.isOpened()) //also tried grab + retrieve, crashes at grab 
     cap>>img; //code crashes here 
     } 
     catch(...) 
     { 
     cout<<"Camera Disconnected"<<endl; 
     } 
    } 
} 

Если я использую весь код в одном классе (в одном заголовочном файле), нет никаких проблем на всех (новый кадр отображается после 4+ секунд без сбоев программы), но если я ставлю код в отдельный класс (другой файл заголовка), затем вызовите функцию, чтобы открыть камеру из объекта класса, затем она сбрасывает , еслиСкорость интернета сокращена.
странное поведение - если я отлаживаю шаг за шагом, он никогда не сбой!

, когда я построить библиотеку OpenCV с FFmpeg, я получаю .pdb файл только для OpenCV (opencv_world310.pdb) - поэтому ни один вопрос не отладки с использованием стека вызовов , но я не получаю PDB для FFmpeg (потому что Opencv_ffmpeg.dll прекомпилируется и вот где его сбой)

поэтому его трудно отлаживать, building ffmpeg не создает файл pdb, потому что он построен с использованием MSYS
, так что можно отлаживать то, что у нас есть?

я в том числе снимок с визуальной отладки студии, некоторые переменные, которые помогут в понимании:

typedef int (*CvGrabFrame_Plugin)(void* capture_handle);  [cap_ffmpeg_api.cpp] 
protected: void* ffmpegCapture;         [cap_ffmpeg.cpp] 
static CvGrabFrame_Plugin icvGrabFrame_FFMPEG_p = 0;   [cap_ffmpeg.cpp] 

enter image description here

Exception брошенным в 0x0A0AF6F0 (opencv_ffmpeg310.dll) в образце .exe: 0xC0000005: Место считывания нарушения доступа 0x00000020. Если для этого исключения есть , программа может быть безопасно продолжена.

в исходном коде я включен ниже линий & скомпилированных & использовал его в проекте - не получился, снова разбился! if(ffmpegCapture) - null указатель проверки

можно ли внести изменения в строку 214 в [cap_ffmpeg.cpp], чтобы избежать сбоя?
Другие файлы заголовков - это только одна папка вверх.

Обновление: Я заметил, что программа сразу же срабатывает, когда я ограничиваю скорость интернет-потребления. Я использую C++/CLI (WinForms, целевая точка NET Framework = 4.6), у меня есть CameraClass (в отдельном заголовочном файле) & основной функции в (отдельный файл заголовка)
Основная функция имеет ниже код

CameraClass ^CC = gcnew CameraClass(); 
CC->OpenCamera(); 

Я не могу создать не управляемый тип объекта в управляемом классе, поэтому я поместил собственные типы (переменные Opencv) в отдельное пространство имен, как показано ниже, чтобы я мог использовать этот класс. возможно, мне нужно использовать внутренние указатели?

#pragma once 
#include"opencv2\opencv.hpp" 
#include <msclr\marshal_cppstd.h> 

namespace SampleApp{ 

    using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 
    using namespace System::Threading; 
    using namespace System::IO; 
    using namespace std; 

    namespace 
    { 
     cv::VideoCapture cap[5]; //max 5 instance for this class 
     cv::Mat image[5]; 
     cv::IplImage pic1[5]; 
     cv::IplImage *pic2[5]; 
    } 

public ref class CamWindow : public WeifenLuo::WinFormsUI::Docking::DockContent 
{ 
    public: CamWindow(void) 
    { 
      InitializeComponent(); 
    } 
    Void OpenCamera() 
    { 


    } 
. 
. 
. 
. 
}; 
} 

определенно сошелся .net обработки & C++ памяти обработки памяти?

+1

Вы проверяете 'cap.isOpened()' перед тем, как читать? – AndyG

+1

Я тоже попробовал это вместе с grab & retrieve, он по-прежнему падает! потому что камера все еще будет открыта, только использование скорости интернета в приложении сильно сокращается .. –

+1

Спасибо за ответ. Что вы подразумеваете под словом «open will be open»? Кроме того, когда вы переключились на 'grab' +' retrieve', на котором он умер? – AndyG

ответ

2

Вы можете объявить неуправляемый класс. Имейте указатель на него из управляемого класса.

public class OpenCVClass 
{ 
     public: 
     Void OpenCamera() 
      { 
       VideoCapture cap("http://192.168.1.3:8080/video?x.xmjpeg"); 
       Mat img; 
       while(true) 
        { 
        try 
        { 
         if(cap.isOpened()) 
         cap>>img; 
        } 
        catch(...) 
        { 
         cout<<"Camera Disconnected"<<endl; 
        } 
        } 
      } 

     public ref class managed 
     { 
     public: 
      managed(){} 
      ~managed(){} 
      static OpenCVClass* unmanaged = new OpenCVClass(); 
      unmanaged->OpenCVClass(); 
     }; 
} 

Если длл был построен на MSYS, вы можете использовать addr2line command для преобразования адреса внутри DLL к исходной линии, либо использовать неуправляемые переменный в функции управляемого класса.

Смежные вопросы