On Wednesday 09 June 2004 19:31, Paul Mitterberger wrote:
Bei einem X-Programmbeispiel erhalte ich an der unten markierten Stelle folgende Fehlermeldung beim Ausführen:
X Error of failed request: BadMatch (invalid parameter attributes) Major opcode of failed request: 1 (X_CreateWindow) Serial number of failed request: 7 Current serial number in output stream: 10
Program exited with code 01.
Hier der Programmcodeabschnitt dazu:
8< ---- schnipp
XEvent event; char ch; KeySym keysym; XComposeStatus xcompstat; int mouse_x, mouse_y; while(1) { char event_txt[80]; XNextEvent(dpy, &event); // <- hier erfolgt der Programmabbruch
Das ist völlig normal - das ist die X-Event-Schleife. Naturgemäß verbringt jedes X-Programm den überwiegenden Teil seiner Zeit darin, und naturgemäß wird alles, was auf Events reagiert (d.h. fast das gesamte Programm) von dort aus ausgeführt, so daß man XNextEvent() und Verwandte einfach IMMER bei einem Backtrace dabei hat. Ausgelöst wurde das Problem aber mit ziemlicher Sicherheit ganz woanders.
switch(event.type) {
8< ---- schnapp
Kann mir jemand sagen, wo da der Fehler liegt? XCreateWindow wird hier nicht aufgerufen sondern in einer anderen Funktion davor, und die Parameter dpy und &event (da ein Pointer erwartet wird) stimmen.
Da kann es tausend und eine Ursachen geben - eventgesteuerte Programmierung
ist ein sehr komplexes Thema. Sehr oft werden z.B. die Adressen von lokalen
Variablen an Funktionen übergeben, die diese Pointer dann ggf. irgendwo
ablegen und später benutzen (also dorthin schreiben oder von dort lesen
wollen) - wenn die lokale Variable schon längst nicht mehr existiert. Dann
kann sonstwas passieren.
Außerdem ist X paketorientiert und asynchron, d.h. wenn Du eine Xlib-Funktion
XCreateWindow() aufrufst, wird zwar der entsprechende X-Request erzeugt und
in ein TCP/IP-Paket eingepackt, aber nicht notwendigerweise sofort
verschickt; das passiert erst, wenn eine Paket "voll" ist. Damit soll
Netzwerkverkehr minimiert werden. Das kann aber z.B. dazu führen, daß erst
beim nächsten X-Request oder nach einem gewissen Timeout dieses Paket
verschickt und beim X-Server ausgeführt wird und man einen eventuellen Fehler
erst später mitbekommt.
Zum Debuggen kann man XSync() und XFlush() verwenden, um so etwas gleich
festzustellen. Manche Toolkits bieten auch eine Kommandozeilenoption -sync
(oder so) an, um den X-Traffic synchron zu halten - was zwar ineffizienter
ist (mehr Netzwerkverkehr, mehr Latenzzeiten) aber bei der Fehlersuche sehr
hilfreich sein kann.
Siehe auch O'Reilly Buch zu X11 Band 1 - die ersten paar Kapitel sollte man
auf jeden Fall gelesen haben, wenn man unter X programmiert.
http://www.amazon.de/exec/obidos/ASIN/1565920023/
CU
--
Stefan Hundhammer