Laden...

HEAP Error in Programm mit externer DLL

Erstellt von das-mo vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.013 Views
D
das-mo Themenstarter:in
9 Beiträge seit 2008
vor 8 Jahren
HEAP Error in Programm mit externer DLL

Hallo,

Ich habe ein Programm zur gleichzeitigen Messwertaufnahme von 4 Drehmomentsensoren geschrieben. Jedoch bekomme ich in ganz zufälligen Zeitabständen Programmabstürze mit folgenden Fehlermeldungen:

möglicher Fehler 1:> Fehlermeldung:

Critical error detected c0000374

möglicher Fehler 2:> Fehlermeldung:

HEAP[Maschine1272.exe]: HEAP: Free Heap block 1f542f90 modified at 1f5431a0 after it was freed

Und dann kommt immer noch dieser Hinweis:> Fehlermeldung:

Windows hat einen Haltepunkt in Maschine1272.exe ausgelöst.

Dies kann auf eine Beschädigung des Heaps zurückzuführen sein, die auf ein Problem in Maschine1272.exe oder in einer der geladenen DLLs hinweist.

Dies kann auch darauf zurückzuführen sein, dass der Benutzer F12 drückt, während Maschine1272.exe den Fokus hat.

Weitere Analyseinformationen finden Sie möglicherweise im Ausgabefenster.
Das Programm "[7764] Maschine1272.exe: Systemeigen" wurde mit Code -1 (0xffffffff) beendet.
Das Programm "[7764] Maschine1272.exe: Verwaltet (v4.0.30319)" wurde mit Code -1 (0xffffffff) beendet.

Laut anderer Beiträge bei Stackoverflow & Co. tritt dieser Fehler auf wenn ich bereits freigegeben Speicher benutzen möchte, was mir jetzt aber nicht direkt auffällt.

Ich habe grob folgenden Programmablauf: 1 Timer überwacht die Variablen die aus meiner Steuerung kommen und wenn die Variable MessenEin für eine der 4 Sensoren true wird, wird die Methode StartSpom ausgeführt, wechselt die Variable auf false wird die Methode StopSpom ausgeführt und mithilfe von 4 StreamWritern werden die Messwerte in CSV-Files geschrieben. Alles dazwischen übernehmen die 4 Timer für die 4 Sensoren.

Hier ein bisschen Code:


private void StartSpom(int station)	//0-3
{
	if (!GlobaleVariablen.Seriell.portActive[station])
	{
	portHandle[station] = C8661Port.bp8661_OpenInterface(GlobaleVariablen.Seriell.port[station]);

			if (portHandle[station] < 0)
			{
				Console.Out.WriteLine("StartSpom()>portHandle[]: " + portHandle[station]);
				SPS_Variablen.nachSPSTisch[station].bAutomatikStopp.ValueAsObject = false;
			}
			else
			{
				//C8661Port.bp8661_SetAverage(portHandle[station], 0);
				C8661Port.bp8661_GotoSpom(portHandle[station]);
				timerSpom[station].Enabled = true;
				GlobaleVariablen.Seriell.portActive[station] = true;
			}
	}
	else
	{
		Console.Out.WriteLine("StartSpom(): Port Already Open");
	}
	blockTimer[station] = false;
}

private void StopSpom(int station)	//0-3
{
	if (GlobaleVariablen.Seriell.portActive[station])
	{
		timerSpom[station].Enabled = false;
		GlobaleVariablen.Seriell.portActive[station] = false;
		try
		{
			C8661Port.bp8661_StopSpom(portHandle[station]);
			C8661Port.bp8661_CloseInterface(portHandle[station]);
		}
		catch (AccessViolationException ex)
		{
			Console.Out.WriteLine("StopSpom(): " + ex.Message.ToString());
		}

		WriteData(station);
		listTorque[station].Clear();
		listAngle[station].Clear();
	}
	else
	{
		Console.Out.WriteLine("StopSpom(): Port is not Open");
	}
	blockTimer[station] = false;
	}

Und hier noch eins von den 4 Timer Events:


private void timerSpom1_Elapsed(object sender, EventArgs e)
{
	int _retValue;
	float _winkel;

	_retValue = C8661Port.bp8661_GetSpomValue(portHandle[0], ref valueTorque[0,0], ref valueSpeed[0,0], ref valueAngle[0,0], ref valuePower[0,0], ref valueIncrement[0,0]);
	if (_retValue != (int)C8661Port.ENErrors.FUNCTION_OK)
	{
		Console.Out.WriteLine("" + _retValue);
	}

	for (int i = 0; i < 10; i++)
	{
		listTorque[0].Add(valueTorque[0,i]);

		//negative Winkel umrechnen
		_winkel = valueAngle[0,i] % 360;
		if (_winkel < 0)
		{
			_winkel = 360 + _winkel;
		}
		listAngle[0].Add(_winkel);
	}
}

Ich hoffe ihr könnt mir helfen 😄

Viele Grüße
das-mo

Hinweis von Coffeebean vor 8 Jahren

Bitte benutze die richtigen Code-Tags! Punkt 6

[Hinweis] Wie poste ich richtig?

16.834 Beiträge seit 2008
vor 8 Jahren

..teilweise ziemlich gruseliger Code 🙂
Wenn ich schon was mit Global lese sträuben sich die Haare =)

Dein Zugriff auf den Port scheint wohl irgendeine externe DLL zu sein (C/C++...?), richtig?
Da scheint irgendein ungültiger Zugriff zu erfolgen. Hier nicht ersichtlich.
Insbesondere, dass Du von einem Port direkt irgendwelche globalen Variablen referenzierst sieht weder sinnvoll noch glücklich aus.

Besser wäre das globale Zeugs zu verwerfen und mit ordentlichen, isolierten Klassen zu arbeiten.
[Artikel] Drei-Schichten-Architektur

W
872 Beiträge seit 2005
vor 8 Jahren

Es gibt verschiedene mögliche Probleme:* DLL Calling Convention stimmt nicht *Werte müssen auf einen festen Platz gelegt werden *Zusätzliche Referenzen müssen gehalten werden, da der Garbage Collector nicht sieht, was im Unmanaged Bereich abläuft

MSDN Interop Marshalling ist ein guter Startpunkt.