Suche Hilfe zum Finden eines segmention fault fehlers (Bin Anfänger)



  • Hallo,
    ich spiele mich ein bisschen mit C. Ich glaube hier im Forum habe ich einen Code-Schnipsel gefunden, der einen Tastendurck als XSendEvent() an das per Option definierte Fenster schickt. Nun habe ich versucht das Programm um die Funktion XGetInputFocus() so zu erweitern, dass die Tastendrücke an das aktive Fenster gesendet werden. Dabei muss ich einen Fehler gemacht haben. Nur leider weiß ich nicht genau wo. Wenn ich im google nach `_fp_hw' suche komme ich leider nicht weiter.
    Vielen Dank schon mal!

    #include <stdio.h>
    #include <stdlib.h>
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <string.h>
    
    int main (int argc, char *argv[]) {
          Display *display;
          Window *focus_return;
          int *revert_to_return;
      int i;
    
      if (argc<3) {
        printf("usage: ./sendkey key1 key2 key3 etc.\n\n");
        return(1);
      }
    
    if ((display = XOpenDisplay(NULL)) == NULL)
    {
            printf("Unable to open display\n");
            return 1;
    }
    
    XGetInputFocus(display, focus_return,revert_to_return);
    
      for (i=3; i<argc; ++i) {
        XEvent ev;
        KeySym key;
        ev.xkey.type=KeyPress;
        ev.xkey.window=(int)focus_return;
        ev.xkey.root=ev.xkey.subwindow=None;
        ev.xkey.time=0;
        ev.xkey.x=ev.xkey.y=ev.xkey.x_root=ev.xkey.y_root=0;
        ev.xkey.state=0;
        key=XStringToKeysym(argv[i]);
        ev.xkey.keycode=XKeysymToKeycode(display, key);
        ev.xkey.same_screen=True;
        XSendEvent(display, (int)focus_return, True, KeyPressMask, &ev);
        ev.type=KeyRelease;
        XSendEvent(display, (int)focus_return, True, KeyReleaseMask, &ev);
      }
    
      XCloseDisplay(display);
    
      return(0);
    }
    

    Hier der Error (von gcc -W -Wall):

    collect2: ld terminated with signal 11 [Segmentation fault]
    sendkey(.rodata+0x0): multiple definition of `_fp_hw'
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crt1.o(.rodata+0x0):../sysdeps/i386/elf/start.S:65: first defined here
    sendkey(.data+0x4): In function `__data_start':
    : multiple definition of `__dso_handle'
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/crtbegin.o(.data+0x0): first defined here
    sendkey(.init+0x0): In function `_init':
    /tmp/glibc-2.3.5/build-glibc-2.3.5/csu/crti.S:35: multiple definition of `_init'
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crti.o(.init+0x0):/tmp/glibc-2.3.5/build-glibc-2.3.5/csu/crti.S:12: first defined here
    sendkey(.text+0x0): In function `_start':
    ../sysdeps/i386/elf/start.S:65: multiple definition of `_start'
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crt1.o(.text+0x0):../sysdeps/i386/elf/start.S:65: first defined here
    sendkey(.text+0xc4): In function `main':
    : multiple definition of `main'
    /tmp/cc6jfdFj.o(.text+0x0): first defined here
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../../i486-slackware-linux/bin/ld: Warning: size of symbol `main' changed from 367 in /tmp/cc6jfdFj.o to 344 in sendkey
    sendkey(.fini+0x0): In function `_fini':
    /tmp/glibc-2.3.5/build-glibc-2.3.5/csu/crti.S:51: multiple definition of `_fini'
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crti.o(.fini+0x0): first defined here
    sendkey(*ABS*+0x8049974): In function `__init_array_start':
    send.c: multiple definition of `_GLOBAL_OFFSET_TABLE_'
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crt1.o(.got.plt+0x0):../sysdeps/i386/elf/start.S:65: first defined here
    sendkey(.rodata+0x4): multiple definition of `_IO_stdin_used'
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crt1.o(.rodata+0x4):../sysdeps/i386/elf/start.S:71: first defined here
    sendkey(.data+0x0): In function `__data_start':
    : multiple definition of `__data_start'
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crt1.o(.data+0x0):../sysdeps/i386/elf/start.S:65: first defined here
    /usr/lib/gcc-lib/i486-slackware-linux/3.3.6/../../../crt1.o(.dynamic+0x0):../sysdeps/i386/elf/start.S:65: multiple definition of `_DYNAMIC'
    


  • ich schieb dich lieber mal nach linux, denn dein problem hat imho mehr mit x11 als mit c zu tun und im linux forum wird dir eher jemand helfen koennen. schliesslich segfaultet dein compiler und nicht dein programm...



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Oh entschuldigung, ich hatte vergessen zu erwähnen, das auch das Programm segfaultet.



  • wie kompilierst du?

    mfg blan



  • gcc sendtest.c -o send -W -Wall -L /usr/X11/lib -lX11



  • Ich muss mich gestern vertippt haben! (da hatte ich den Fehler in eine Datei kopiert)
    mit

    gcc sendtest.c -o send -W -Wall -L /usr/X11/lib -lX11
    

    kommt der gcc error nicht mehr!

    Aber das Programm mach bei der Ausführung

    Segmentation fault
    

    Wie finde ich den Fehler?



  • Indem Du mit -g kompilierst und dann mal den gdb anwirfst. (Optional mit ddd oä als Interface.)



  • also bei mir tuts auch mitm kompilieren - wie rufe ich das programm auf, was muss ich für parameter übergeben, dann kann ichs ma testen... ?

    edit: wieso muss ichn als parameter immer -L/usr/X11R6/lib machen? ohne kommt immer der fehler cannot find -lX11 - aber in meiner ld.so.conf steht /usr/X11R6/lib drin 😮

    mfg blan



  • 3 getrennte Buachstaben also z.b. 3 2 1
    ./send 3 2 1



  • Mein gdb sagt, dass der Fehler in dieser Zeile auftaucht:

    XGetInputFocus(display, focus_return,revert_to_return);
    

    Und wenn Du Dir genau anschaust, was Du da übergibst, dann sollte Dich das auch nicht wundern. 😉



  • blan schrieb:

    edit: wieso muss ichn als parameter immer -L/usr/X11R6/lib machen? ohne kommt immer der fehler cannot find -lX11 - aber in meiner ld.so.conf steht /usr/X11R6/lib drin 😮

    Die ld.so.conf ist ja nur für ldconfig gut, nicht damit Du beim Linken keinen -Librarysuchpfad angeben musst.



  • okay gut und wie behebe ich dann das problem? ^^

    mfg blan



  • gdb --exec send
    

    bringt

    GNU gdb 6.3
    Copyright 2004 Free Software Foundation, Inc.
    GDB is free software, covered by the GNU General Public License, and you are
    welcome to change it and/or distribute copies of it under certain conditions.
    Type "show copying" to see the conditions.
    There is absolutely no warranty for GDB.  Type "show warranty" for details.
    This GDB was configured as "i486-slackware-linux".
    (gdb) run 1 2 3
    Starting program: /home/poison/joy2key-1.6/send 1 2 3
    (no debugging symbols found)
    Using host libthread_db library "/lib/tls/libthread_db.so.1".
    (no debugging symbols found)
    (no debugging symbols found)
    (no debugging symbols found)
    
    Program received signal SIGSEGV, Segmentation fault.
    0xb7f2b656 in XGetInputFocus () from /usr/X11R6/lib/libX11.so.6
    

    Also habe ich bei XGetImputFocus etwas falsch gemacht? Aber was? Was bedeutet 0xb7f2b656?
    Danke für den Tipp mit gdb :)!



  • blan schrieb:

    okay gut und wie behebe ich dann das problem? ^^

    Das ist kein Problem. Du kannst ja auch make oä verwenden, dann sparst Du Dir die Schreibarbeit.



  • Naja, schau Dir die ganzen Parameter mal genau an. Du übergibst lauter Pointer ins Daten-Nirvana...



  • Bekomme ich die Werte denn nicht erst von XGetImputFocus()?



  • schau dir doch mal die x11 referenz an 😃

    http://tronche.com/gui/x/xlib/input/XGetInputFocus.html

    mfg blan



  • 😃
    Danke!
    nun klappt's

    #include <stdio.h>
    #include <stdlib.h>
    #include <X11/Xlib.h>
    #include <X11/Xutil.h>
    #include <string.h>
    
    int main (int argc, char *argv[]) {
          Display *display;
          Window focus_return;
          int revert_to_return;
      int i;
    
      if (argc<3) {
        printf("usage: ./sendkey key1 key2 key3 etc.\n\n");
        return(1);
      }
    
    if ((display = XOpenDisplay(NULL)) == NULL)
    {
            printf("Unable to open display\n");
            return 1;
    }
    
    XGetInputFocus(display, &focus_return,&revert_to_return);
    
      for (i=3; i<argc; ++i) {
        XEvent ev;
        KeySym key;
        ev.xkey.type=KeyPress;
        ev.xkey.window=focus_return;
        ev.xkey.root=ev.xkey.subwindow=None;
        ev.xkey.time=0;
        ev.xkey.x=ev.xkey.y=ev.xkey.x_root=ev.xkey.y_root=0;
        ev.xkey.state=0;
        key=XStringToKeysym(argv[i]);
        ev.xkey.keycode=XKeysymToKeycode(display, key);
        ev.xkey.same_screen=True;
        XSendEvent(display, focus_return, True, KeyPressMask, &ev);
        ev.type=KeyRelease;
        XSendEvent(display, focus_return, True, KeyReleaseMask, &ev);
      }
    
      XCloseDisplay(display);
    
      return(0);
    }
    

Anmelden zum Antworten