Auffinden eines Fehlers welcher nicht auf jedem PC auftritt



  • Mein Projekt besteht aus einer Kommandozeilenanwendung und einem Plug-in, die Kommandozeilenanwendung soll CD Images in mein Format konvertieren und auch wieder zurück und das Plug-in soll diese Dateien lesen und an das Programm weiterreichen.

    Also das Kommandozeilenprogramm scheint auf allen Rechnern zu funktionieren zumindest gibt es keine Fehler beim Hashwert der Ausgabedatei.

    Das Problem ist folgendes, mein Plug-in funktioniert in meiner Virtuellen Maschine wo ich auch Visual Studio 2010 installiert habe problemlos, auf meinem Host gibt es schon kleinere Probleme und zwar fast immer wenn die Dateiauswahl angezeigt wird und ich danach das Plug-in starte stürzt es ab wenn ich aber keine Dateiauswahl anzeige gibt es scheinbar keine Probleme und auf einem älteren PC mit Windows XP geht gar nichts das Programm welches mein Plug-in nutzt beendet sich einfach ohne Fehlermeldung.

    Die Dateiauswahl dient nur dazu ein Image zu bestimmen welches dann geladen wird dieser wert wird auch gespeichert und beim Programmstart wieder geladen.

    Fehlermeldung vom Host (Windows 7 64-bit)
    Der Fehlermodulname ist aber nicht immer der gleiche ich habe auch schon ntdll.dll und msvcr100.dll beobachtet.

    Problemereignisname:	BEX
      Anwendungsname:	pcsxr.exe
      Anwendungsversion:	1.0.0.1
      Anwendungszeitstempel:	4e9e77df
      Fehlermodulname:	cdrPirate3.dll_unloaded
      Fehlermodulversion:	0.0.0.0
      Fehlermodulzeitstempel:	4ea005ae
      Ausnahmeoffset:	6c0e1b70
      Ausnahmecode:	c0000005
      Ausnahmedaten:	00000008
      Betriebsystemversion:	6.1.7601.2.1.0.256.1
      Gebietsschema-ID:	1031
      Zusatzinformation 1:	0a9e
      Zusatzinformation 2:	0a9e372d3b4ad19135b953a78882e789
      Zusatzinformation 3:	0a9e
      Zusatzinformation 4:	0a9e372d3b4ad19135b953a78882e789
    

    Ich habe auch schon den Remotedebugger probiert aber auch hier keine Ahnung woher dass kommt.

    Fehlermeldung vom Host mit Remotedebugger.

    Problemereignisname:	APPCRASH
      Anwendungsname:	pcsxr.exe
      Anwendungsversion:	1.0.0.1
      Anwendungszeitstempel:	4e9e77df
      Fehlermodulname:	ntdll.dll
      Fehlermodulversion:	6.1.7601.17514
      Fehlermodulzeitstempel:	4ce7ba58
      Ausnahmecode:	00000000
      Ausnahmeoffset:	0001017e
      Betriebsystemversion:	6.1.7601.2.1.0.256.1
      Gebietsschema-ID:	1031
      Zusatzinformation 1:	0a9e
      Zusatzinformation 2:	0a9e372d3b4ad19135b953a78882e789
      Zusatzinformation 3:	0a9e
      Zusatzinformation 4:	0a9e372d3b4ad19135b953a78882e789
    

    Callstack

    ntdll.dll!77de15ee() 	
     	[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]	
     	ntdll.dll!77de15ee() 	
     	ntdll.dll!77dd015e() 	
     	dinput8.dll!6d68a10f() 	
     	dinput8.dll!6d68a407() 	
     	dinput8.dll!6d67c7ba() 	
     	dinput8.dll!6d67c7c8() 	
     	dinput8.dll!6d68a47e() 	
     	user32.dll!778d8102() 	
     	user32.dll!778d80a9() 	
     	user32.dll!778d7bca() 	
    >	pcsxr.exe!SysUpdate()  Line 1905 + 0xc bytes	C
     	pcsxr.exe!EmuUpdate()  Line 59	C
     	pcsxr.exe!psxRcntUpdate()  Line 309	C
     	pcsxr.exe!psxBranchTest()  Line 152	C
     	0268bd78()	
     	pcsxr.exe!recExecute()  Line 463 + 0x5 bytes	C
     	pcsxr.exe!MainWndProc(HWND__ * hWnd, unsigned int msg, unsigned int wParam, long lParam)  Line 484 + 0xc bytes	C
     	user32.dll!778d62fa() 	
     	user32.dll!778d6d3a() 	
     	user32.dll!778d6ce9() 	
     	user32.dll!778d77c4() 	
     	user32.dll!778d7bca() 	
     	pcsxr.exe!RunGui()  Line 249 + 0xc bytes	C
     	pcsxr.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow)  Line 240	C
     	pcsxr.exe!__tmainCRTStartup()  Line 275 + 0x2c bytes	C
     	pcsxr.exe!WinMainCRTStartup()  Line 189	C
     	kernel32.dll!7735339a() 	
     	ntdll.dll!77df9ed2() 	
     	ntdll.dll!77df9ea5()
    

    Callstack vom alten PC (Windows XP SP3)

    >	cdrPirate3.dll!eccedc_init()  Line 108 + 0xc bytes	C++
     	cdrPirate3.dll!EcmDecode2(unsigned char * dest, unsigned int * destLen, const unsigned char * src, const unsigned int srcLen)  Line 131	C++
     	cdrPirate3.dll!TMyTrackFileInterfaceCompressedCdrPirateData::decompressBuffer(const unsigned char * srcBuf, const unsigned int srcLen, unsigned char * dstBuf, unsigned int & dstLen, std::bitset<32> filters, const bool checkCRC)  Line 488 + 0x15 bytes	C++
     	cdrPirate3.dll!TMyTrackFileInterfaceCompressedCdrPirateData::seekUnbuffered$omp$1()  Line 282 + 0x56 bytes	C++
     	vcomp100d.dll!_vcomp::fork_helper(void (<no type>)* funclet, int arg_count, char * argptr)  Line 355	C++
     	vcomp100d.dll!_vcomp::fork_helper_wrapper(void (<no type>)* funclet, int arg_count, char * argptr)  Line 324 + 0x11 bytes	C++
     	vcomp100d.dll!_vcomp::ParallelRegion::HandlerThreadFunc(void * context, unsigned long index)  Line 303 + 0x1a bytes	C++
     	vcomp100d.dll!InvokeThreadTeam(_THREAD_TEAM * ptm, void (void *, unsigned long)* pfn, void * pvContext)  Line 634	C++
     	vcomp100d.dll!_vcomp_fork(int if_test, int arg_count, void (<no type>)* funclet, ...)  Line 207	C++
     	cdrPirate3.dll!TMyTrackFileInterfaceCompressedCdrPirateData::seekUnbuffered(const unsigned int lba)  Line 279 + 0x20 bytes	C++
     	cdrPirate3.dll!TMyTrackFileInterface::seek(const unsigned int lba, const bool usePregap)  Line 140 + 0x19 bytes	C++
     	cdrPirate3.dll!TMyDiscFileInterface::seekTrack(const unsigned int lba, const unsigned int track, const bool usePregap)  Line 197 + 0x35 bytes	C++
     	cdrPirate3.dll!TMyDiscFileInterface::seekDisc(const unsigned int lba, const bool usePregap)  Line 238 + 0x79 bytes	C++
     	cdrPirate3.dll!getDiscOffset()  Line 209	C++
     	cdrPirate3.dll!openIt()  Line 291	C++
     	cdrPirate3.dll!CDRopen()  Line 379	C++
     	pcsxr.exe!_OpenPlugins(HWND__ * hWnd)  Line 219 + 0x8 bytes	C
     	pcsxr.exe!OpenPlugins(HWND__ * hWnd, int internaliso)  Line 305 + 0x9 bytes	C
     	pcsxr.exe!MainWndProc(HWND__ * hWnd, unsigned int msg, unsigned int wParam, long lParam)  Line 461 + 0x9 bytes	C
     	user32.dll!7e368734() 	
     	[Frames below may be incorrect and/or missing, no symbols loaded for user32.dll]	
     	user32.dll!7e368816() 	
     	user32.dll!7e3689cd() 	
     	user32.dll!7e3696c7() 	
     	pcsxr.exe!RunGui()  Line 249 + 0xc bytes	C
     	pcsxr.exe!WinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, char * lpCmdLine, int nCmdShow)  Line 240	C
     	pcsxr.exe!__tmainCRTStartup()  Line 275 + 0x2c bytes	C
     	pcsxr.exe!WinMainCRTStartup()  Line 189	C
     	kernel32.dll!7c817077()
    

    Weitere Vorgehensweise und mögliche Ursachen?



  • Wer bitte soll das alles lesen und unter den verschiedenen Systemumgebungen nachvollziehen? 😕 Für solche Dinge eignen sich Logfiles oder Debug. Dann weiss man besser, wo etwas nicht laufen will und vielleicht auch warum. Ich fürchte: So wie du dein Problem darstellst, kann dir kaum jemand helfen.
    Bedenke bitte: Jeder hier möchte helfen, aber dafür nicht lange nachdenken oder sogar alles nachvollziehen müssen - ich jedenfalls nicht! 😮



  • Der Callstack weist auf einen Multithreading-Fehler beim hin, vielleicht hast du ein paar locks vergessen. Die eccedc_init-Funktion klingt verdächtig. Was macht die und ist die dafür ausgelegt, wiederholt und evtl. von mehreren Threads gleichzeitig aufgerufen zu werden?
    Schalt OpenMP mal aus und sieh nach, ob die Probleme immer noch auftreten.



  • Also eccedc_init Initialisiert Variablen die mit "static" deklariert wurden diese sind aber "threadprivate" und somit hat jeder Thread seine eigenen.

    static uint8_t  ecc_f_lut[256];
    static uint8_t  ecc_b_lut[256];
    static uint32_t edc_lut  [256];
    #pragma omp threadprivate(ecc_f_lut, ecc_b_lut, edc_lut)
    

    Allerdings ist ecc_f_lut auf meinem alten Rechner (WinXP) mit dem Remotedebugger ein "bad ptr" nicht aber auf den anderen beiden PCs (Win7).

    Wie in meinem ersten Beitrag schon erwähnt habe ich ein Kommandozeilenprogramm und ein Plug-In diese teilen sich den Code der für das Lesen und Schreiben verantwortlich ist aber nur das Plug-In macht Probleme.
    Das Kommandozeilenprogramm komprimiert, dekomprimiert und verifiziert meine Testimages mit 1, 2, 3 oder 4 Threads ohne Probleme.

    Auch ohne OpenMP treten Probleme auf, OpenMP verwende ich nur zum komprimieren und dekomprimieren der einzelnen Datenblöcke.



  • Kennst du valgrind? Gibt es leider nur für Linux, kann jedoch genau die Art von Fehlern zuverlässig analysieren solange alles über dem Heap läuft. Den Stack kann er leider nicht analysieren.



  • Verlass dich aber nicht allzusehr auf die Fehlerorte von valgrind.

    Sicherlich hat es mir heute den Tag gerettet. Manchmal hilft es aber auch den Code nochmal grob durchzuschauen.

    Hatte heute n größeres Problem beim zerlegen und dynamischen Speichern von Strings... da hilft mir eine Fehlerortsmeldung von ungültigem Lesen von 2 Byte iwo in gmtime.c(oder so) herzlich wenig.



  • Logfiles können helfen! Die macht man selbst und braucht keine system- oder compiler-abhängige Dinge mehr! Findet alle Fehler garantiert. Die Behebung ist dann eine andere Sache. 🤡


Anmelden zum Antworten