2012-11-26 5 views
7

ho avuto un problema di run time con il mio matlab c/C++ lib condivisa. La libreria esporta e l'applicazione è compilata e collegata correttamente. Ma in fase di esecuzione lo script sembra avere molti errori. Non c'è nessun errore visualizzato nella finestra della console (visualizzazione dell'output Matlab) della mia applicazione. Ma il debugger mostra un sacco di eccezioni non rilevate in fuga. Ma lo script sembra scorrere e l'applicazione termina correttamente.Matlab Shared C/C++ lib in VS10/12 genera molte eccezioni

Alcune cose da sapere:

  • Sulla Win8 Pro x64
  • Visual Studio 2012 (Impostazioni del progetto sono VS 2010, che è stato installato correttamente)
  • Matlab R2012b (32bit) (versione a 64 bit è anche installato, ma non utilizzati qui, per quanto ne so)
  • MCR R2012b win32/64 è installato
  • compilatore utilizzato in MATLAB Compiler è il VS2010 uno (la compilazione con GUI-compilatore)

Bene, qui è il file-m Sono esportare ad un lib comune:

% Create video input object. 
vid = videoinput('winvideo', 1, 'YUY2_320x240') 

% Set video input object properties for this application. 
set(vid,'TriggerRepeat',Inf); 
vid.FrameGrabInterval = 3; 

% Set value of a video source object property. 
vid_src = getselectedsource(vid); 
set(vid_src,'Tag','motion detection setup'); 
set(vid,'ReturnedColorSpace','rgb'); 

% Create a figure window. 
figure; 
% wiener filter neighbourhood 
wienerFilter = [5 5]; 
% Start acquiring frames. 
start(vid) 

% Calculate difference image and display it. 
while(vid.FramesAcquired<=200) % Stop after 200 frames 
    data = getdata(vid,2); 

    first_img = wiener2(rgb2gray(data(:,:,:,1)), wienerFilter); 
    second_img = wiener2(rgb2gray(data(:,:,:,2)), wienerFilter); 

    bw_img = im2bw(first_img); 

    diff_im = imabsdiff(first_img,second_img); 

    subplot(1,3,1), imshow(first_img); 
    subplot(1,3,2), imshow(second_img); 
    subplot(1,3,3), imshow(diff_im); 

end 

stop(vid) 

delete(vid) 
close(gcf) 

Se si dispone di una webcam sul computer lo script dovrebbe funzionare senza errori!

Ora il principale file C++:

#include "stdafx.h" 
#include "MatlabCompilerSample.h" 

#pragma comment(lib, "MatlabCompilerSample.lib") 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    /* Call the MCR and library initialization functions */ 
    if(!mclInitializeApplication(NULL,0)) 
    { 
     const char* message = mclGetLastErrorMessage(); 
     printf_s(message); 
     fprintf(stderr, "Could not initialize the application.\n"); 
     exit(1); 
    } 

    if (!MatlabCompilerSampleInitialize()) 
    { 
     fprintf(stderr,"Could not initialize the library.\n"); 
     exit(1); 
    } 

    /* Call the implementation function */ 
    WebcamSample(); 

    /* Call the library termination function */ 
    MatlabCompilerSampleTerminate(); 

    mclTerminateApplication(); 
    return 0; 
} 

Sembra buono fino ad ora? Dopo aver caricato un mucchio di dll inizia il casino. Guardate le eccezioni e le stronzate gettato:

'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\WinSxS\x86_microsoft.vc90.mfcloc_1fc8b3b9a1e18e3b_9.0.30729.6161_none_49768ef57548175e\MFC90DEU.DLL'. Module was built without symbols. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: std::runtime_error at memory location 0x003DF4A0. 
SetThrowSegvLongjmpSEHFilter(): filter function installed 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003D6210. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003D5A4C. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003D6210. 

Beh questo è va avanti un po 'e poi:

'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\profapi.dll'. Cannot find or open the PDB file. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: boost::thread_interrupted at memory location 0x060EFD98. 
The thread 0x2478 has exited with code 0 (0x0). 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DE000. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DD83C. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DE000. 

Quello non è tutto ...

First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DD0B4. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DDEA0. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: boost::thread_interrupted at memory location 0x061EF980. 
The thread 0x282c has exited with code 0 (0x0). 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DE328. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DDB64. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DE328. 

...

First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: xsd_binder::MalformedDocumentError at memory location 0x003DE1C8. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: boost::thread_interrupted at memory location 0x061EFC14. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: boost::thread_interrupted at memory location 0x060EFDEC. 
The thread 0x32a4 has exited with code 0 (0x0). 
The thread 0x350c has exited with code 0 (0x0). 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: boost::thread_interrupted at memory location 0x060EFC1C. 
The thread 0xfd8 has exited with code 0 (0x0). 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: boost::thread_interrupted at memory location 0x05FEFC7C. 
The thread 0x2144 has exited with code 0 (0x0). 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\client\jvm.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmm.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcr71.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winmmbase.dll'. Cannot find or open the PDB file. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: std::runtime_error at memory location 0x0771F404. 
SetThrowSegvLongjmpSEHFilter(): filter function installed 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\NapiNSP.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\pnrpnsp.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\nlaapi.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\mswsock.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dnsapi.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\winrnr.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Program Files (x86)\Common Files\Microsoft Shared\Ink\tiptsf.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cfgmgr32.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\verify.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\java.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\hpi.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\zip.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\fontmanager.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\awt.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\apphelp.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\nativejmi.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\nativeservices.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\nativejava.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\net.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\sys\java\jre\win32\jre\bin\nio.dll'. Cannot find or open the PDB file. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: std::runtime_error at memory location 0x0771F284. 
SetThrowSegvLongjmpSEHFilter(): filter function installed 
First-chance exception at 0x76AB4B32 (KernelBase.dll) in MatlabCompilerCPPExample.exe: 0x000006BA: Der RPC-Server ist nicht verfügbar. 
The thread 0x37b0 has exited with code 0 (0x0). 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: CryptoPP::AES_PHM_Decryption::InvalidCiphertextOrKey at memory location 0x0771C1B8. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: CryptoPP::AES_PHM_Decryption::InvalidCiphertextOrKey at memory location 0x0771C988. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x077189E7. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x0771B82C. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x07717E57. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x0771ACA0. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\libmwbuiltins.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\mlint.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'C:\Windows\SysWOW64\version.dll'. Cannot find or open the PDB file. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x07717E57. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x0771ACA0. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\libmwmathelem.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\libmwmathxps.dll'. Cannot find or open the PDB file. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: varflowFailedException at memory location 0x0771BCD7. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: varflowFailedException at memory location 0x0771BD82. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\hgbuiltins.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\nativemvm.dll'. Cannot find or open the PDB file. 
'MatlabCompilerCPPExample.exe' (Win32): Loaded 'N:\Programme\MATLAB\2012b (32Bit)\bin\win32\nativehg.dll'. Cannot find or open the PDB file. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: CryptoPP::AES_PHM_Decryption::InvalidCiphertextOrKey at memory location 0x07716AC0. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x07714C0F. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x07717A5C. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: CryptoPP::AES_PHM_Decryption::InvalidCiphertextOrKey at memory location 0x07717628. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x0771367F. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedExceptionNoUCB at memory location 0x077137EC. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x07715940. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x077162C7. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: tfFailedException at memory location 0x07719110. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: varflowFailedException at memory location 0x07719773. 
First-chance exception at 0x76AB4B32 in MatlabCompilerCPPExample.exe: Microsoft C++ exception: varflowFailedException at memory location 0x077197EE. 

L'intero file è 6000 l ines ... lo posterò se necessario! Qui si ferma dopo tutto:

First-chance exception at 0x76AB4B32 (KernelBase.dll) in MatlabCompilerCPPExample.exe: 0xA1A01DB2 (parameters: 0x1FD09FE6, 0x1FD08200, 0x00000000). 
The program '[3324] MatlabCompilerCPPExample.exe' has exited with code 0 (0x0). 

Sarei felice per ogni suggerimento, grazie in anticipo!

+0

Molti di questi messaggi sembrano correlati al fatto che non ci sono simboli di debug definiti per la DLL. Si blocca da qualche parte, tenta di entrare in modalità di debug e fallisce. –

+0

Inoltre. Hai provato a compilare un semplice tipo di programma "ciao mondo"? La tua pipeline del compilatore di solito funziona senza errori? Uno dei miei tocchi preferiti qui è quello di rimuovere/aggiungere righe allo script matlab e vedere quando fallisce esattamente. –

risposta

2

Queste sono tutte eccezioni di prima scelta e non significa che ci sia un problema. Li ho visti molto nel mio precedente lavoro e Matlab ha la tendenza a produrre un'eccezione che non è stato un vero problema.

http://blogs.msdn.com/b/davidklinems/archive/2005/07/12/438061.aspx

Esiste una prima eccezione di possibilità significa che esiste un problema nel mio codice? I messaggi di prima eccezione spesso non significano che ci sia un problema nel codice.Per le applicazioni/i componenti che gestiscono le eccezioni con garbo, i messaggi di eccezioni di prima scelta consentono allo sviluppatore di sapere che è stata rilevata una situazione eccezionale ed è stata gestita.

+0

Il vero problema è che MATLAB lancia effettivamente un _lot_ di eccezioni, sia durante l'inizializzazione che durante l'esecuzione. Sono evidentemente gestiti internamente ma mi sembra che questo dimostri che il loro modello di programmazione include gli anti-pattern dell'uso di eccezioni invece di altri metodi di controllo del flusso più appropriati e anche di deglutire eccezioni potenzialmente valide (quando eseguo il debug di un'applicazione basata su MATLAB Troverò spesso che il debugger si arresta con l'eccezione di AccessViolation che legge una posizione di memoria quasi zero.) – Mozzis