Open syfluqs opened 3 years ago
You can run (depending on where xcircuit is installed) "gdb /usr/local/lib/xcircuit-3.10/xcircexec", followed by "run", and then when/if it segfaults, type "bt" to get a backtrace. That will help me figure out what's going on.
This is what I get with gdb
(gdb) set pagination off
(gdb) run
Starting program: /usr/lib/xcircuit-3.10/xcircexec
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
[New Thread 0x7ffff680e640 (LWP 330848)]
Starting xcircuit under Tcl interpreter
Thread 1 "xcircexec" received signal SIGSEGV, Segmentation fault.
0x00007ffff7763672 in XQueryPointer () from /usr/lib/libX11.so.6
(gdb) bt
#0 0x00007ffff7763672 in XQueryPointer () from /usr/lib/libX11.so.6
#1 0x00007ffff6e4f4ad in ?? () from /usr/lib/xcircuit-3.10/xcircuit.so
#2 0x00007ffff6e4f519 in ?? () from /usr/lib/xcircuit-3.10/xcircuit.so
#3 0x00007ffff6e8fb34 in ?? () from /usr/lib/xcircuit-3.10/xcircuit.so
#4 0x00007ffff6eb0a49 in ?? () from /usr/lib/xcircuit-3.10/xcircuit.so
#5 0x00007ffff7dcbc62 in TclNRRunCallbacks () from /usr/lib/libtcl8.6.so
#6 0x00007ffff7dcdb3a in TclEvalEx () from /usr/lib/libtcl8.6.so
#7 0x00007ffff7dce363 in Tcl_EvalEx () from /usr/lib/libtcl8.6.so
#8 0x00007ffff7c5edb1 in Tk_BindEvent () from /usr/lib/libtk8.6.so
#9 0x00007ffff7c63a95 in TkBindEventProc () from /usr/lib/libtk8.6.so
#10 0x00007ffff7c6bc35 in Tk_HandleEvent () from /usr/lib/libtk8.6.so
#11 0x00007ffff7c6be51 in WindowEventProc () from /usr/lib/libtk8.6.so
#12 0x00007ffff7e95fda in Tcl_ServiceEvent () from /usr/lib/libtcl8.6.so
#13 0x00007ffff7e96257 in Tcl_DoOneEvent () from /usr/lib/libtcl8.6.so
#14 0x00007ffff6eb253c in ?? () from /usr/lib/xcircuit-3.10/xcircuit.so
#15 0x00007ffff6eb2abd in ?? () from /usr/lib/xcircuit-3.10/xcircuit.so
#16 0x00007ffff7dcbc62 in TclNRRunCallbacks () from /usr/lib/libtcl8.6.so
#17 0x00007ffff7dcdb3a in TclEvalEx () from /usr/lib/libtcl8.6.so
#18 0x00007ffff7e8836a in Tcl_FSEvalFileEx () from /usr/lib/libtcl8.6.so
#19 0x00007ffff7e8850a in Tcl_EvalFile () from /usr/lib/libtcl8.6.so
#20 0x00007ffff7e8fed5 in Tcl_SourceRCFile () from /usr/lib/libtcl8.6.so
#21 0x00007ffff7c7b4f6 in Tk_MainEx () from /usr/lib/libtk8.6.so
#22 0x00005555555551ea in ?? ()
#23 0x00007ffff7a83152 in __libc_start_main () from /usr/lib/libc.so.6
#24 0x000055555555504e in ?? ()
Does "ldd /bin/wish" include "libX11" in the output? This looks like Tk isn't compiled for X11, which is something that is common on a Mac or on Windows, but I'm not used to seeing it on Linux.
yes it does
$ ldd /bin/wish | grep X11
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f2f50183000)
Here is the full output also, if that is of any use
$ ldd /bin/wish
linux-vdso.so.1 (0x00007ffc45171000)
libtk8.6.so => /usr/lib/libtk8.6.so (0x00007f372948d000)
libtcl8.6.so => /usr/lib/libtcl8.6.so (0x00007f37292cd000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f3729104000)
libXft.so.2 => /usr/lib/libXft.so.2 (0x00007f37290eb000)
libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0x00007f37290a0000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f3728f5f000)
libXss.so.1 => /usr/lib/libXss.so.1 (0x00007f3728f58000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f3728e12000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f3728e0c000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007f3728df2000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f3728dd0000)
/lib64/ld-linux-x86-64.so.2 => /usr/lib64/ld-linux-x86-64.so.2 (0x00007f3729678000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x00007f3728cfc000)
libXrender.so.1 => /usr/lib/libXrender.so.1 (0x00007f3728ced000)
libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00007f3728cbe000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f3728c94000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f3728c7f000)
libbz2.so.1.0 => /usr/lib/libbz2.so.1.0 (0x00007f3728c6c000)
libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f3728c35000)
libharfbuzz.so.0 => /usr/lib/libharfbuzz.so.0 (0x00007f3728b5f000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f3728b5a000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f3728b52000)
libgraphite2.so.3 => /usr/lib/libgraphite2.so.3 (0x00007f3728b2d000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007f37289f9000)
libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007f3728985000)
Today I noticed that xcircuit runs fine on my machine if I change the window manager. The segmentation fault appears only when using awesomewm titling window manager. This is peculiar because I also use magic (the layout tool which also has a GUI and uses Tcl/Tk) and it runs fine on awesomewm. So I guess, somewhere xcircuit is trying to access through a pointer to a X11 window property or something and my window manager doesn't provide/instantiate it.
Also, the segmentation fault occurs right after the xcircuit window acquires focus.
I hope this is something to go on for further investigation.
I just pushed a likely fix to the master repo at opencircuitdesign.com (version 3.10.34). Please give it a try and let me know if it works or not.
still segfaults, but the backtrace has changed
(gdb) run
Starting program: /usr/lib/xcircuit-3.10/xcircexec
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
XCOps(scale) set to 1
[New Thread 0x7ffff48bb640 (LWP 626597)]
Starting xcircuit under Tcl interpreter
Thread 1 "xcircexec" received signal SIGSEGV, Segmentation fault.
0x00007ffff7978672 in XQueryPointer () from /usr/lib/libX11.so.6
(gdb) bt
#0 0x00007ffff7978672 in XQueryPointer () from /usr/lib/libX11.so.6
#1 0x00007ffff4d35848 in UGetCursor () at functions.c:782
#2 0x00007ffff4d358b2 in UGetCursorPos () at functions.c:811
#3 0x00007ffff4d75230 in make_new_event (event=0x7fffffffc480) at tclxcircuit.c:265
#4 0x00007ffff4d957b2 in xctcl_standardaction (clientData=0x5555555dee20, interp=0x555555598d30, objc=4, objv=0x55555559d560) at tclxcircuit.c:9454
#5 0x00007ffff7e44c62 in TclNRRunCallbacks () from /usr/lib/libtcl8.6.so
#6 0x00007ffff7e46b3a in TclEvalEx () from /usr/lib/libtcl8.6.so
#7 0x00007ffff7e47363 in Tcl_EvalEx () from /usr/lib/libtcl8.6.so
#8 0x00007ffff7cd7db1 in Tk_BindEvent () from /usr/lib/libtk8.6.so
#9 0x00007ffff7cdca95 in TkBindEventProc () from /usr/lib/libtk8.6.so
#10 0x00007ffff7ce4c35 in Tk_HandleEvent () from /usr/lib/libtk8.6.so
#11 0x00007ffff7ce4e51 in WindowEventProc () from /usr/lib/libtk8.6.so
#12 0x00007ffff7f0efda in Tcl_ServiceEvent () from /usr/lib/libtcl8.6.so
#13 0x00007ffff7f0f257 in Tcl_DoOneEvent () from /usr/lib/libtcl8.6.so
#14 0x00007ffff4d97274 in GUI_init (objc=1, objv=0x55555559d298) at tclxcircuit.c:10050
#15 0x00007ffff4d977dd in xctcl_start (clientData=0x5555555dee20, interp=0x555555598d30, objc=1, objv=0x55555559d298) at tclxcircuit.c:10175
#16 0x00007ffff7e44c62 in TclNRRunCallbacks () from /usr/lib/libtcl8.6.so
#17 0x00007ffff7e46b3a in TclEvalEx () from /usr/lib/libtcl8.6.so
#18 0x00007ffff7f0136a in Tcl_FSEvalFileEx () from /usr/lib/libtcl8.6.so
#19 0x00007ffff7f0150a in Tcl_EvalFile () from /usr/lib/libtcl8.6.so
#20 0x00007ffff7f08ed5 in Tcl_SourceRCFile () from /usr/lib/libtcl8.6.so
#21 0x00007ffff7cf44f6 in Tk_MainEx () from /usr/lib/libtk8.6.so
#22 0x0000555555555263 in main (argc=1, argv=0x7fffffffd848) at xcircexec.c:76
If I deliberately hard code the position returned from UGetCursor()
and comment out everything else (XQueryPointer calls), I get
(gdb) run
Starting program: /usr/lib/xcircuit-3.10/xcircexec
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
XCOps(scale) set to 1
[New Thread 0x7ffff48bb640 (LWP 636415)]
Starting xcircuit under Tcl interpreter
Thread 1 "xcircexec" received signal SIGSEGV, Segmentation fault.
0x00007ffff79cffc4 in XkbLookupKeySym () from /usr/lib/libX11.so.6
(gdb) bt
#0 0x00007ffff79cffc4 in XkbLookupKeySym () from /usr/lib/libX11.so.6
#1 0x00007ffff79d0981 in XLookupString () from /usr/lib/libX11.so.6
#2 0x00007ffff4d05fb8 in getkeysignature (event=0x7fffffffc480) at events.c:2402
#3 0x00007ffff4d06325 in keyhandler (w=0x0, clientdata=0x0, event=0x7fffffffc480) at events.c:2510
#4 0x00007ffff4d9577d in xctcl_standardaction (clientData=0x5555555dee20, interp=0x555555598d30, objc=4, objv=0x55555559d560) at tclxcircuit.c:9492
#5 0x00007ffff7e44c62 in TclNRRunCallbacks () from /usr/lib/libtcl8.6.so
#6 0x00007ffff7e46b3a in TclEvalEx () from /usr/lib/libtcl8.6.so
#7 0x00007ffff7e47363 in Tcl_EvalEx () from /usr/lib/libtcl8.6.so
#8 0x00007ffff7cd7db1 in Tk_BindEvent () from /usr/lib/libtk8.6.so
#9 0x00007ffff7cdca95 in TkBindEventProc () from /usr/lib/libtk8.6.so
#10 0x00007ffff7ce4c35 in Tk_HandleEvent () from /usr/lib/libtk8.6.so
#11 0x00007ffff7ce4e51 in WindowEventProc () from /usr/lib/libtk8.6.so
#12 0x00007ffff7f0efda in Tcl_ServiceEvent () from /usr/lib/libtcl8.6.so
#13 0x00007ffff7f0f257 in Tcl_DoOneEvent () from /usr/lib/libtcl8.6.so
#14 0x00007ffff4d9719d in GUI_init (objc=1, objv=0x55555559d298) at tclxcircuit.c:10050
#15 0x00007ffff4d97706 in xctcl_start (clientData=0x5555555dee20, interp=0x555555598d30, objc=1, objv=0x55555559d298) at tclxcircuit.c:10175
#16 0x00007ffff7e44c62 in TclNRRunCallbacks () from /usr/lib/libtcl8.6.so
#17 0x00007ffff7e46b3a in TclEvalEx () from /usr/lib/libtcl8.6.so
#18 0x00007ffff7f0136a in Tcl_FSEvalFileEx () from /usr/lib/libtcl8.6.so
#19 0x00007ffff7f0150a in Tcl_EvalFile () from /usr/lib/libtcl8.6.so
#20 0x00007ffff7f08ed5 in Tcl_SourceRCFile () from /usr/lib/libtcl8.6.so
#21 0x00007ffff7cf44f6 in Tk_MainEx () from /usr/lib/libtk8.6.so
#22 0x0000555555555263 in main (argc=1, argv=0x7fffffffd848) at xcircexec.c:76
If you can go back to the previous state where it crashed on XQueryPointer(), then instead of doing "bt", run the commands:
up
print dpy
print areawin->area
print Tk_WindowId(areawin->area)
That would help me debug. I'm not sure what's going on.
(gdb) print dpy
$1 = (Display *) 0x0
(gdb) print areawin->area
$2 = (Tk_Window) 0x555555b3fd50
(gdb) print Tk_WindowId(areawin->area)
No symbol "Tk_WindowId" in current context.
(gdb) print areawin->window
$3 = 7599670935249759856
Okay, I'm pretty sure that I understand now what is going on; certain callbacks are being made before the global "dpy" variable is set, and some of those may call routines that depend on "dpy". So I rearranged the code to set "dpy" before allowing the callback functions to run. I think that should fix the problem. Let me know if it doesn't. Again, the fix was pushed to the master branch of the repo on opencircuitdesign.com.
It now exits with an X error,
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 3 (X_GetWindowAttributes)
Resource id in failed request: 0x696c2e70
Serial number of failed request: 4584
Current serial number in output stream: 4585
Actually, if I keep the xcircuit window below everything i.e. the window is not in the foreground, I am able to click on the toolbar buttons and the canvas and it works functionally. But as soon as the parent window or any of the child windows are brought to the foreground, it gives me the above X error and exits.
Here is the gdb output if it helps
(gdb) run
Starting program: /usr/lib/xcircuit-3.10/xcircexec
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
XCOps(scale) set to 1
[New Thread 0x7ffff48bb640 (LWP 199628)]
Starting xcircuit under Tcl interpreter
Thread 1 "xcircexec" hit Breakpoint 1, UGetCursor () at functions.c:760
760 {
(gdb) print dpy
$1 = (Display *) 0x5555555f4670
(gdb) print areawin->area
$2 = (Tk_Window) 0x555555b38c80
(gdb) print Tk_WindowId(areawin->area)
No symbol "Tk_WindowId" in current context.
(gdb) break 789
Breakpoint 2 at 0x7ffff4d3585b: file functions.c, line 794.
(gdb) continue
Continuing.
Thread 1 "xcircexec" hit Breakpoint 2, UGetCursor () at functions.c:794
794 newpos.x = xpos;
(gdb) print Tk_WindowId(areawin->area)
No symbol "Tk_WindowId" in current context.
(gdb) print areawin->area
$3 = (Tk_Window) 0x555555b38c80
(gdb) continue
Continuing.
Key 'Button1' is not bound to a macro
Thread 1 "xcircexec" hit Breakpoint 1, UGetCursor () at functions.c:760
760 {
(gdb) print dp
No symbol "dp" in current context.
(gdb) print dpy
$4 = (Display *) 0x5555555f4670
(gdb) continue
Continuing.
Thread 1 "xcircexec" hit Breakpoint 2, UGetCursor () at functions.c:794
794 newpos.x = xpos;
(gdb) continue
Continuing.
Thread 1 "xcircexec" hit Breakpoint 1, UGetCursor () at functions.c:760
760 {
(gdb) continue
Continuing.
Thread 1 "xcircexec" hit Breakpoint 2, UGetCursor () at functions.c:794
794 newpos.x = xpos;
(gdb) continue
Continuing.
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 3 (X_GetWindowAttributes)
Resource id in failed request: 0x696c2e70
Serial number of failed request: 3224
Current serial number in output stream: 3225
[Thread 0x7ffff48bb640 (LWP 199628) exited]
[Inferior 1 (process 199621) exited with code 01]
(gdb)
Sounds closer to working, anyway. Can you break on "XGetWindowAttributes" and do a backtrace? It's called from some Tk routine, so I don't know where it's called in xcircuit. It may or may not fail the first time it is called, so it may be necessary to keep breaking on it and figure out where it was in xcircuit on the last time it was called before it flagged the invalid Window value.
If I repeat continue for about 285-300 times, most of the times, the GUI ran perfectly without any errors.
(gdb) break XGetWindowAttributes
Function "XGetWindowAttributes" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (XGetWindowAttributes) pending.
(gdb) run
Starting program: /usr/lib/xcircuit-3.10/xcircexec
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
Breakpoint 1, 0x00007ffff7968a70 in XGetWindowAttributes () from /usr/lib/libX11.so.6
(gdb) continue 300
Will ignore next 299 crossings of breakpoint 1. Continuing.
XCOps(scale) set to 1
[New Thread 0x7ffff48bb640 (LWP 238912)]
Starting xcircuit under Tcl interpreter
Loaded font file fonts/helvetica.lps
Loaded font file fonts/times_roman.lps
Loaded font file fonts/courier.lps
Loaded font file fonts/symbol.lps
Loaded font file fonts/times_romaniso2.lps
Loaded font file fonts/courieriso2.lps
Loaded font file fonts/helveticaiso2.lps
Loaded font file fonts/times_romaniso5.lps
Created new object Cr::Scedil
Created new object Cr::scedil
Loaded font file fonts/courieriso5.lps
Created new object Hv::scedil
Loaded font file fonts/helveticaiso5.lps
Loaded font file fonts/times_roman.lps
Loaded font file fonts/courier.lps
Loaded font file fonts/helvetica.lps
Loaded library file generic.lps
Loaded library file analog.lps
Loaded library file avlsi.lps
Loaded library file digital.lps
Loaded library file digitaltcl.lps
Loaded library file analoglib3.lps
%
Sometimes I got the previous X error and other times I got the following error.
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /usr/lib/xcircuit-3.10/xcircexec
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
XCOps(scale) set to 1
Breakpoint 1, 0x00007ffff7968a70 in XGetWindowAttributes () from /usr/lib/libX11.so.6
(gdb) continue 288
Will ignore next 287 crossings of breakpoint 1. Continuing.
Starting xcircuit under Tcl interpreter
[New Thread 0x7ffff48bb640 (LWP 239598)]
Thread 1 "xcircexec" received signal SIGSEGV, Segmentation fault.
0x00007ffff78b07f0 in cairo_xlib_surface_set_size () from /usr/lib/libcairo.so.2
(gdb) bt
#0 0x00007ffff78b07f0 in cairo_xlib_surface_set_size () from /usr/lib/libcairo.so.2
#1 0x00007ffff4d14af0 in resizearea (w=0x555555b40ec0, clientdata=0x0, calldata=0x0) at events.c:6435
#2 0x00007ffff4d95aa3 in xctk_resizearea (clientData=0x0, eventPtr=0x7fffffffcb00) at tclxcircuit.c:9557
#3 0x00007ffff7ce4b9f in Tk_HandleEvent () from /usr/lib/libtk8.6.so
#4 0x00007ffff7d02f00 in TkDoConfigureNotify () from /usr/lib/libtk8.6.so
#5 0x00007ffff7cf1e5e in ArrangeGrid () from /usr/lib/libtk8.6.so
#6 0x00007ffff7f31f97 in TclServiceIdle () from /usr/lib/libtcl8.6.so
#7 0x00007ffff7f0f22d in Tcl_DoOneEvent () from /usr/lib/libtcl8.6.so
#8 0x00007ffff4d972b0 in GUI_init (objc=1, objv=0x55555559d298) at tclxcircuit.c:10053
#9 0x00007ffff4d97813 in xctcl_start (clientData=0x5555555dee20, interp=0x555555598d30, objc=1, objv=0x55555559d298) at tclxcircuit.c:10178
#10 0x00007ffff7e44c62 in TclNRRunCallbacks () from /usr/lib/libtcl8.6.so
#11 0x00007ffff7e46b3a in TclEvalEx () from /usr/lib/libtcl8.6.so
#12 0x00007ffff7f0136a in Tcl_FSEvalFileEx () from /usr/lib/libtcl8.6.so
#13 0x00007ffff7f0150a in Tcl_EvalFile () from /usr/lib/libtcl8.6.so
#14 0x00007ffff7f08ed5 in Tcl_SourceRCFile () from /usr/lib/libtcl8.6.so
#15 0x00007ffff7cf44f6 in Tk_MainEx () from /usr/lib/libtk8.6.so
#16 0x0000555555555263 in main (argc=1, argv=0x7fffffffd848) at xcircexec.c:76
(gdb) up
#1 0x00007ffff4d14af0 in resizearea (w=0x555555b40ec0, clientdata=0x0, calldata=0x0) at events.c:6435
6435 cairo_xlib_surface_set_size(areawin->surface, areawin->width,
(gdb) print areawin->surface
$1 = (cairo_surface_t *) 0x286d726f6674616c
(gdb) print areawin->width
$2 = 1159
(gdb) print areawin->height
$3 = 861
(gdb)
The call to cairo_xlib_surface_set_size
is also accessing the earlier surface
member from areawin
.
I couldn't find a definite place in xcircuit code where the call to XGetWindowAttributes
breaks. It certainly appears to be a timing issue/race condition. I suspect everything ran fine most of the time inside the debug environment because of slower execution with a breakpoint on XGetWindowAttributes
.
Hope this helps. If there is any other way to investigate further, please let me know.
I'll probably have to get awesomewm and try it myself. This kind of race condition has cropped up before, and is always window manager-dependent. But I have never been able to create a setup that I could duplicate the issue with.
I have a similar issue trying to compile in OpenBSD/adJ and running with fluxbox as Window Manager.
I compiled the version of the master branch of github that is the same of git://opencircuitdesign.com/xcircuit using Tcl/Tk 8.6.8
After compiling, installing and running it presents the GUI:
But pushing any button will produce:
X Error of failed request: BadWindow (invalid Window parameter)
Major opcode of failed request: 2 (X_ChangeWindowAttributes)
Resource id in failed request: 0x0
Serial number of failed request: 3983
Current serial number in output stream: 3983
That is very similar to https://github.com/RTimothyEdwards/XCircuit/issues/10#issuecomment-795644565
Following is my system configuration (Arch linux)
and package versions
Upon running xcircuit from the terminal, it shows the gui and immediately crashes without any error messages, just this