Fehlermeldung *** glibc detected *** python: free(): invalid

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Hey Python Junks...:)

Ich habe da ein Problem für das ich keine Lösung finde.
Immer wenn ich mein kitt.py Script laufen lasse. Bricht es nach einiger Zeit mit folgender Fehlermeldung ab.

*** glibc detected *** python: free(): invalid pointer: 0x0113ad68 ***

Diese Script habe ich zum testen der RASPI NEOPIXEL Libary umgeschrieben und soll das Knight Rider Lauflicht imitieren.
Andere Scripte in denen ich die Libary importierte, brechen nicht mit einer Fehlermeldung ab.
Kann mir jemand sagen wo der Fehler zu finden ist und wie ich ihn ggf. ausmerzen kann?

Vielen Dank im Voraus.

Code: Alles auswählen

#!/usr/bin/env python
import time
from neopixel import *


# LED strip configuration:
LED_COUNT = 15      		# Number of LED pixels.
LED_PIN = 12      		# GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ = 800000            # LED signal frequency in hertz (usually 800khz)
LED_DMA = 5      		# DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS = 255    	# Set to 0 for darkest and 255 for brightest
LED_INVERT = False  	 	# True to invert the signal (when using NPN transistor level shift)

ZEIT = 800.0
FARBE = 255
FARBE = FARBE/4
FARBE2 = FARBE/8


# Define functions which animate LEDs.
def ledOff(strip, color):
	for i in range(LED_COUNT):
	  strip.setPixelColor(i, Color(0, 0, 0))
	  strip.show()

# Check & start all LEDs.
def ledKitt(strip, color, wait_ms=50):
      for k in range(strip.numPixels()):
        strip.setPixelColor(k, color)
        strip.show()
      time.sleep(wait_ms/200.0)
      for l in range(strip.numPixels()):
        ledOff(strip, color)

# Runing order.
      for x in range(1, LED_COUNT, 1):
		for i in range(strip.numPixels()):
			if i == (LED_COUNT):
				strip.setPixelColor((LED_COUNT), color)
			else:
				y=i
				strip.setPixelColor(i, color)
				y=y-1
				strip.setPixelColor(y, Color((FARBE), 0, 0))
				y=y-1
				strip.setPixelColor(y, Color((FARBE2), 0, 0))
				strip.show()
				time.sleep(wait_ms/ZEIT)
				strip.setPixelColor(y, Color(0, 0, 0))

		for j in range((LED_COUNT), -1, -1):
			if j == (LED_COUNT):
				strip.setPixelColor((LED_COUNT), color)
			else:
				y=j
				strip.setPixelColor(j, color)
				y=y+1
				strip.setPixelColor(y, Color((FARBE), 0, 0))
				y=y+1
				strip.setPixelColor(y, Color((FARBE2), 0, 0))
				strip.show()
				time.sleep(wait_ms/ZEIT)
				strip.setPixelColor(y, Color(0, 0, 0))


# Main program logic follows:
if __name__ == '__main__':
	# Create NeoPixel object with appropriate configuration.
	strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
	# Intialize the library (must be called once before other functions).
	strip.begin()

	print 'Press Ctrl-C to quit.'
	while True:
	  try:	
		ledKitt(strip, Color(255, 0, 0))

	  finally:
		ledOff(strip, Color(0, 0, 0))
		exit(0)
PS. An dem Script habe ich jetzt 4 Wochen rum gedoktort. Ursprünglich hatte das Script 200 Zeilen mehr(*anfängerstolz*).
Vielleicht hat jemand noch einen Tipp oder einen Verbesserungsvorschlag. :)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: in Zeile 44 greifst Du auf Pixel -1 zu. Das könnte Probleme machen.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Sirius3 hat geschrieben:@JenselBensel: in Zeile 44 greifst Du auf Pixel -1 zu. Das könnte Probleme machen.
Inwiefern?
In Zeile 36 ist i in range durch das Objekt strip.numPixel() klar mit definiert.
Also Werte von 1-15(bzw. 0-14). Wodurch -1 auf 0 erstmal keine Auswirkung zeigt. Erst in der Rangefolge wird die Auswirkung von -1 bemerkbar. Wobei i als Variable sich erst verändert sobald die Schleife wieder startet.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Vielleicht sollte ich noch dabei schreiben dass das Script soweit arbeitet und erst einigen Durchläufen diesen Fehler generiert.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: Wenn Du keine Antworten willst, brauchst Du nicht fragen. Du kannst gerne noch 4 weitere Wochen herumdoktorn.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Sirius3 hat geschrieben:@JenselBensel: Wenn Du keine Antworten willst, brauchst Du nicht fragen. Du kannst gerne noch 4 weitere Wochen herumdoktorn.
Warum so schnippisch? Ich habe nicht gesagt das ich keine Antwort haben möchte.
Ganz im Gegenteil. Ich frage sogar noch wie ich Deine Antwort zu verstehen habe.
Da sich von meinem Verständnis her das Script/Interpret so verhält und ich den möglichen Fehler vielleicht übersehen.
Warum Du darauf so reagierst ist mir ein Rätsel und Spekulationen oder Thesen dazu werde ich mir nicht anmaßen.
Nur gehe ich davon aus, wenn mir jemand eine Antwort auf eine Frage gibt. Ist er auch in der Lage ist mir den Fehler genauer zu erklären. Da er sonst auch nicht antworten würde...

Es tut mir Leid wenn ich Deine elitäre Ruhezeit mit meiner eher lästigen Frage gestört habe.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JenselBensel hat geschrieben:In Zeile 36 ist i in range durch das Objekt strip.numPixel() klar mit definiert.
In Zeile 44 verwendest du aber nicht i sondern y.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

/me hat geschrieben:
JenselBensel hat geschrieben:In Zeile 36 ist i in range durch das Objekt strip.numPixel() klar mit definiert.
In Zeile 44 verwendest du aber nicht i sondern y.
Ja genau, und in Zeile 41 ist "y=i" weil ich "y" für den auf "i" folgenden Schweif brauche.

Den Schweif definiert habe ich von Zeile 43 bis 49. "i" ist meine Konstante sich bewegende LED und "y" ist der variable Wert mit dem 2 bzw. 3 dunkler leuchtenden LEDs definiert sind.

Muß ich das Script deutlicher beschreiben?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: wir kennen Dein Skript genau. Geh mal von Schritt für Schritt die Zeilen durch und schreib Dir auf, welche Werte die Variablen nacheinander alle haben. Und wenn Du zum ersten Mal in Zeile 44 bist, sag uns welchen Wert y hat.
BlackJack

@JenselBensel: Falls Du dann immer noch glaubst wir haben das Skript nicht verstanden, könntest Du auch den Wert mal ausgeben lassen und mit Deiner Sicht der Dinge vergleichen. :-)

Mal allgemein zur Fehlermeldung: Da ist ein in C geschriebener Teil der einen Fehler in der Speicherverwaltung hat, schuld. Das könnte theoretisch der Python-Interpreter selbst sein, das ist aber eher unwahrscheinlich, weil der gut getestet ist, sowohl automatisiert, als auch von vielen Benutzern. Also ist das wahrscheinlich C-Code irgendwo in dem importierten Modul.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das `y` in Zeile 43 nimmt beim ersten Durchlauf definitiv den Wert -1 an. Es muss nicht zwangsläufig der Grund für den Absturz sein, aber es wäre denkbar. Sowas kann nämlich - wenn nicht entsprechend abgesichert - zu undefiniertem Verhalten führen, dessen Auswirkungen sich mitunter erst viel später bemerkbar machen.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

JenselBensel hat geschrieben:Den Schweif definiert habe ich von Zeile 43 bis 49. "i" ist meine Konstante sich bewegende LED und "y" ist der variable Wert mit dem 2 bzw. 3 dunkler leuchtenden LEDs definiert sind.

Muß ich das Script deutlicher beschreiben?
`i` liegt aufgrund von `range()` im Intervall [0, strip.numPixels() - 1]. Davon ziehst du für `y` eins ab. Hierdurch wird das `y` negativ und wird so an `setPixelColor` übergeben. Davon war die Rede.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

snafu hat geschrieben:
JenselBensel hat geschrieben:Den Schweif definiert habe ich von Zeile 43 bis 49. "i" ist meine Konstante sich bewegende LED und "y" ist der variable Wert mit dem 2 bzw. 3 dunkler leuchtenden LEDs definiert sind.

Muß ich das Script deutlicher beschreiben?
`i` liegt aufgrund von `range()` im Intervall [0, strip.numPixels() - 1]. Davon ziehst du für `y` eins ab. Hierdurch wird das `y` negativ und wird so an `setPixelColor` übergeben. Davon war die Rede.
Ja ganz genau diese Verhalten habe ich auch schon am Freitag fest gestellt. Nachdem ich mir die Variablen habe ausgeben lassen.
Hier ist dann auch mein Denkfehler. Aus irgendeinem Grund habe ich mir gedacht das -1 = 0 ist und somit als solches kein Fehler darstellt.
Der Grund war bestimmt die Menge der LEDs die angesprochen werden. Die Anzahl -1 gibt es ja nicht. :oops:

KLAR!!! Lösung des Problems sollte ich mit einer IF Verzweigung hin bekommen. :D :D :D

Erstmal vielen Dank an alle für eure Hilfe. Werde das Script gleich dem entsprechend umschreiben und mich danach nochmal melden. :mrgreen:
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

So hier ist mein geändertes Script.
Jetzt habe ich auch genau verstanden wie das Problem zu stande kam.

Vielen Dank nochmals und Happy Kadavar!!!

Code: Alles auswählen

#!/usr/bin/env python
import time
from neopixel import *


# LED strip configuration:
LED_COUNT      	= 15      		# Number of LED pixels.
LED_PIN        	= 18      		# GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ    	= 800000	   	# LED signal frequency in hertz (usually 800khz)
LED_DMA        	= 5      		# DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS 	= 255    	 	# Set to 0 for darkest and 255 for brightest
LED_INVERT     	= False  	 	# True to invert the signal (when using NPN transistor level shift)

ZEIT = 800.0
FARBE = LED_BRIGHTNESS/4
FARBE2 = FARBE/4


# Define functions which animate LEDs in various ways.
def ledOff(strip, color):
	for i in range((LED_COUNT)):
	  strip.setPixelColor(i, Color(0, 0, 0))
	  strip.show()

def ledKittfadein(strip, color, wait_ms=50):
	for i in range(0, 255, 10):
		for j in range(strip.numPixels()):
			strip.setPixelColor(j, Color( i, 0, 0))
			strip.show()
			time.sleep(wait_ms/20000)
	for i in range(255, -1, -5):
		for j in range(strip.numPixels()):
			strip.setPixelColor(j, Color( i, 0, 0))
			strip.show()
			time.sleep(wait_ms/20000)
	ledOff(strip, color)
	  
def ledKitt(strip, color, wait_ms=50):
		for i in range((LED_COUNT), -1, -1):
				y=i
				strip.setPixelColor(i, color)
				y=y+1
				print(i, y)
				strip.setPixelColor(y, Color((FARBE), 0, 0))
				strip.setPixelColor((y+1), Color((FARBE2), 0, 0))
				strip.show()
				time.sleep(wait_ms/ZEIT)
				strip.setPixelColor((y+1), Color(0, 0, 0))
		
		for i in range(strip.numPixels()):
				y=i
				strip.setPixelColor(i, color)
				y=y+1
				print(i, y)
				strip.setPixelColor(y, Color((FARBE), 0, 0))
				strip.setPixelColor((y-1), Color((FARBE2), 0, 0))
				strip.show()
				time.sleep(wait_ms/ZEIT)
				strip.setPixelColor((y-1), Color(0, 0, 0))

		


# Main program logic follows:
if __name__ == '__main__':
	# Create NeoPixel object with appropriate configuration.
	strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
	# Intialize the library (must be called once before other functions).
	strip.begin()

	print 'Press Ctrl-C to quit.'
	ledKittfadein(strip, Color(255, 0, 0))
	while True:
	  try:	
		ledKitt(strip, Color(255, 0, 0))

	  finally:
		ledOff(strip, Color(0, 0, 0))
		exit(0)
Zuletzt geändert von JenselBensel am Mittwoch 3. Juni 2015, 07:29, insgesamt 1-mal geändert.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es lag also tatsächlich am negativen `y` (jetzt: `j`), nehme ich an?
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das mit dem i und y ist IMHO auch ein wenig kompliziert... Warum nicht einfach so:

Code: Alles auswählen

...
                for i in range((LED_COUNT), -1, -1):
                                strip.setPixelColor(i, color)
                                strip.setPixelColor(i+1, Color((FARBE), 0, 0))
                                strip.setPixelColor(i+2, Color((FARBE2), 0, 0))
                                strip.show()
                                time.sleep(wait_ms/ZEIT)
                                strip.setPixelColor(i+2, Color(0, 0, 0))
...
Der Sinn ist mir allerdings nicht klar..

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: jetzt überschreitest Du mit setPixel nicht mehr in negative Richtung sondern um zwei Elemente in positive Richtung. Das Programm ist also noch genauso kaputt wie vorher, nur dass die Auswirkungen scheinbar nicht sofort offensichtlich werden.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Sirius3 hat geschrieben:@JenselBensel: jetzt überschreitest Du mit setPixel nicht mehr in negative Richtung sondern um zwei Elemente in positive Richtung. Das Programm ist also noch genauso kaputt wie vorher, nur dass die Auswirkungen scheinbar nicht sofort offensichtlich werden.
Ja richtig. Jetzt laufen nach der ersten LED immer zwei LEDs dunkler vor, und die erste LED ist nicht so hell wie sie sein sollte.
Ich verstehe es einfach nicht und das frustriert mich.

Aber die Fehlermeldung taucht jetzt nicht mehr auf. ^^

Mein Gedanke ist es schon gewesen, einfach 4 Listen zu schreiben (jeweils von 0 - 14, 1 - 15 und von 14 - 0, 15 - 1). Und die durch die Schleifen einfach laufen lassen. Für eine Richtung wird das bestimmt funktionieren.

Nachher werde ich nochmal die Schleife schriftlich durch gehen. Sollte ich es nicht mehr hin bekommen, ist das Testprojekt

Zu Turbo Pascal/Qbasic Zeiten, bzw. etwas später hatte ich mal ein ähnliches Schleifenproblem. Ich glaube mich erinnern zu können dass i nachdem Ablauf der Schleife mit dem letzten Schleifenwert bei erneuert Ausführung des Programm etwas unerwartetes (und für mich nicht offensichtliches) gemacht hat.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: Du hast das Problem, dass Du eine Funktion (setPixelColor) mit ungültigen Parametern aufrufst. Du kannst entweder Deine Schleifen so umschreiben, dass das nicht mehr passiert, was aber schwierig sein kann und Gefahr läuft, dass nicht mehr exakt das erwartete Ergebnis herauskommt, oder Du gehst den einfachen Weg und prüfst bei jedem Aufruf die Korrektheit der Parameter:

Code: Alles auswählen

def set_pixel_color(strip, num, color):
    if 0 <= num < LED_COUNT:
        strip.setPixelColor(num, color)
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Sirius3 hat geschrieben:@JenselBensel: Du hast das Problem, dass Du eine Funktion (setPixelColor) mit ungültigen Parametern aufrufst. Du kannst entweder Deine Schleifen so umschreiben, dass das nicht mehr passiert, was aber schwierig sein kann und Gefahr läuft, dass nicht mehr exakt das erwartete Ergebnis herauskommt, oder Du gehst den einfachen Weg und prüfst bei jedem Aufruf die Korrektheit der Parameter:

Code: Alles auswählen

def set_pixel_color(strip, num, color):
    if 0 <= num < LED_COUNT:
        strip.setPixelColor(num, color)
Ahhhh, Ohhhh und Häää...!!! :lol:

Ahhhh = Problem halb verstanden. Den einfachen Weg habe ich schon in so manchen Scripten gelesen.
Ohhhh = Die Funktion habe ich soweit verstanden.
Hääää = Wie sehen die falschen Parameter aus, bzw. wo durch entstehen sie?

Also müsste ich vor jedem (strip.setPixelColor)-Aufruf die Funktion aufrufen, oder reicht es die Funktion direkt an den Anfang von der Schleife aufzurufen?
Antworten