Was ist die Definition von defekt? Gestern gings noch! (Oder so ähnlich) Ich hab hier einen kleinen MIPS Emulator geschrieben und der funktioniert eigentlich. Unter anderem wird auch eine Videokarte emuliert welche einen VSYNC IRQ generiert und das mit einem Timer. Unter Debian8 lief das bestens, aber nach einem Dist Upgrade auf 9.6 bekomme ich ERRNO 22 (Invalid Argument) bei timer_settime in Z.174. Der Code ist im Anhang in der Funktion video_init. Hat da wer ne Idee wieso das auf einmal rumzickt? In der Manpage: http://man7.org/linux/man-pages/man2/timer_settime.2.html steht drinne, dass keiner der Argumente von timer_settime NULL sein darf. Aber bei allen Beispielen ist old_value immer NULL, weil mans eh nie braucht. Selbst dort einen Pointer reinwerfen ändert nichts am Problem.
Mw E. schrieb: > Unter Debian8 lief das bestens, aber nach einem Dist Upgrade auf 9.6 > bekomme ich ERRNO 22 (Invalid Argument) bei timer_settime in Z.174. Woher weißt du das denn? Du gibst den Fehler nirgends aus. > Hat da wer ne Idee wieso das auf einmal rumzickt? Vergleiche mal die Signatur:
1 | int timer_settime(timer_t timerid, int flags, |
2 | const struct itimerspec *new_value, |
3 | struct itimerspec *old_value); |
mit deinem Aufruf:
1 | ret = timer_settime(&irq_vsync_timer, 0, &irq_zeitbasis, NULL); |
Insbesondere das erste Argument.
Scheint eine Kernel - Funktion zu sein . Der Kernel wird sehr viel an Codeänderungen haben , aber auch eine DotConfig .config -Änderung wäre möglich . Die Werte irq_vsync_timer und irq_zeitbasis könnten nicht vorhanden sein , und ungeprüft in den Aufruf gelegt sein . Wer weiß , ob dieses irq_vsync_timer sich verändert hat , und mehr oder weniger Werte enthält . Schnelle Alternativen : # Alten Kernel in Bootloader eintragen und booten # Neuen Kernel mit funktionierender .config recompillieren
Die Fehlernummer hat mir der GDB zugesteckt. Im GDB kannste dir __errno_location() anzeigen lassen und dann lesen was da steht. Aber ja facepalm, Klassiker. Das ist zu feste bei drinne Handles als Pointer zu übergeben. Interessant was für Schweinereien per Zufall funktionieren. Das hätte ja eigentlich nie funktionieren dürfen. Läuft jetz wieder, danke fürs drauf stoßen!
:
Bearbeitet durch User
Hau Wech schrieb: > Scheint eine Kernel - Funktion zu sein . Es handelt sich um einen POSIX-Standard-Systemaufruf. PS: Du plenkst! Mw E. schrieb: > Die Fehlernummer hat mir der GDB zugesteckt. > Im GDB kannste dir __errno_location() anzeigen lassen und dann lesen was > da steht. Wäre es nicht einfacher, perror() zu verwenden oder alternativ strerror(errno) in deinen eh schon vorhandenen printf() einzubauen? Dann musst du nicht immer den Debugger bemühen, um eine brauchbare Fehlermeldung zu bekommen. > Läuft jetz wieder, danke fürs drauf stoßen! Gerne!
Mw E. schrieb: > Aber ja facepalm, Klassiker. > Das ist zu feste bei drinne Handles als Pointer zu übergeben. Da sollte doch eigentlich der Compiler mindestens warnen. Ich empfehle, immer die Optionen -std=c99 -Wall -Wextra -pedantic -Werror mitzugeben, dann kompiliert sowas gar nicht erst.
Ja eigentlich sollte das ne Warnung geben. Den Fehler hab ich kurz nochmal eingebaut, gab aber keine (gcc 6.3.0). -Wall -Wextra nutze ich immer. Selbst mit -pedantic und c99 kommt da keine Warnung. Das ist wohl das typische Problem wenn durch typedefs bereits ein Pointer wegabstrahiert wird. Denn static timer_t irq_vsync_timer; ist ein Pointer und wird von timer_create alloziert und gefüllt. Da ich es da als Pointer reinwerfen musste hab ichs bei timer_settime wohl auch direkt so getan. Aber eigentlich sollte der gcc mitbekommen, dass er da einen Pointer auf einen Pointer bekommt statt einem Pointer kopfkratz. Hangeln wir uns doch mal lang: - time.h enthält die Funktionen, aber timer_t liegt in sys/types.h - sys/types.h sagt: typedef __timer_t timer_t; - glibc/posix/bits/types.h sagt: __STD_TYPE __TIMER_T_TYPE __timer_t; - glibc/sysdeps/unix/sysv/linux/x86/bits/typesizes.h sagt: #define __TIMER_T_TYPE void * Ja geil nen Voidpointer!
Das meinte ich auch mit der abschließenden Zeile.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.