Open akorn opened 4 years ago
Thank you for trying to debug this. I'm afraid it's not something we've seen before.
Does the strace
stop when this happens or does it continue outputting those lines?
And do you think you could attach gdb
when this happens and get a backtrace for us? You probably also need to install some package with debug symbols. Unfortunately I don't know what those are called in Debian.
strace
continues outputting similar lines indefinitely.
I can try gdb but I'm not very skilled in its use. For example, I don't know how to use the debug symbol packages with it; can you point me at some instructions?
strace
continues outputting similar lines indefinitely.
Alright. Good to know. I would assume that UNIX socket is to the X server. So it seems it is flooding it with some data. Difficult to say what though, so hopefully gdb can help.
I can try gdb but I'm not very skilled in its use. For example, I don't know how to use the debug symbol packages with it; can you point me at some instructions?
It should load the debug symbols automatically as long as they are installed.
Once the hang happens, just run gdb -p <pid of server>
. Then when you get a gdb prompt just type bt full
.
(gdb) bt full
#0 0x00007fc77da15b43 in poll () from /lib/x86_64-linux-gnu/libc.so.6
No symbol table info available.
#1 0x00007fc77d6ebdd3 in ?? () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
No symbol table info available.
#2 0x00007fc77d6ec14f in ?? () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
No symbol table info available.
#3 0x00007fc77d6e9f8f in ?? () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
No symbol table info available.
#4 0x00007fc77d6ea411 in ?? () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
No symbol table info available.
#5 0x00007fc77d6ea4a4 in xcb_writev () from /usr/lib/x86_64-linux-gnu/libxcb.so.1
No symbol table info available.
#6 0x00007fc77e46488e in _XSend () from /usr/lib/x86_64-linux-gnu/libX11.so.6
No symbol table info available.
#7 0x00007fc77e464dbc in _XReply () from /usr/lib/x86_64-linux-gnu/libX11.so.6
No symbol table info available.
#8 0x00007fc77e44a1dc in XGetImage () from /usr/lib/x86_64-linux-gnu/libX11.so.6
No symbol table info available.
#9 0x00007fc77e44a46a in XGetSubImage () from /usr/lib/x86_64-linux-gnu/libX11.so.6
No symbol table info available.
#10 0x0000564d979f8a1c in ShmImage::get (this=<optimized out>, wnd=<optimized out>, x=<optimized out>, y=<optimized out>, w=<optimized out>, h=<optimized out>, dst_x=587, dst_y=1205) at ./unix/x0vncserver/Image.cxx:330
No locals.
#11 0x0000564d979fae3d in XPixelBuffer::grabRect (r=..., this=0x564d98a2f150) at ./common/rfb/Rect.h:108
No locals.
#12 XPixelBuffer::grabRegion (this=0x564d98a2f150, region=...) at ./unix/x0vncserver/XPixelBuffer.cxx:77
rects = std::vector of length 14, capacity 14 = {{tl = {x = 0, y = 25}, br = {x = 2560, y = 1202}}, {tl = {x = 0, y = 1202}, br = {x = 318, y = 1203}}, {tl = {x = 583, y = 1202}, br = {x = 2560, y = 1203}}, {tl = {x = 0, y = 1203}, br = {x = 316, y = 1204}}, {tl = {x = 585, y = 1203}, br = {x = 2560,
y = 1204}}, {tl = {x = 0, y = 1204}, br = {x = 315, y = 1205}}, {tl = {x = 586, y = 1204}, br = {x = 2560, y = 1205}}, {tl = {x = 0, y = 1205}, br = {x = 314, y = 1206}}, {tl = {x = 587, y = 1205}, br = {x = 2560, y = 1206}}, {tl = {x = 0, y = 1206}, br = {x = 313, y = 1208}}, {tl = {x = 588,
y = 1206}, br = {x = 2560, y = 1208}}, {tl = {x = 0, y = 1208}, br = {x = 312, y = 1400}}, {tl = {x = 589, y = 1208}, br = {x = 2560, y = 1400}}, {tl = {x = 0, y = 1400}, br = {x = 2560, y = 1410}}}
i = {tl = {x = 587, y = 1205}, br = {x = 2560, y = 1206}}
#13 0x0000564d97a0f0c7 in rfb::VNCServerST::writeUpdate (this=0x7ffd1d8ba050) at ./common/rfb/VNCServerST.cxx:796
ui = {changed = {rgn = 0x564d98c01410}, copied = {rgn = 0x564d98a37390}, copy_delta = {x = 0, y = 0}}
toCheck = {rgn = 0x564d98c1fc00}
ci = non-dereferenceable iterator for std::list
ci_next = non-dereferenceable iterator for std::list
__PRETTY_FUNCTION__ = "void rfb::VNCServerST::writeUpdate()"
#14 0x0000564d97a0f1ea in rfb::VNCServerST::handleTimeout (this=0x7ffd1d8ba050, t=<optimized out>) at ./common/rfb/VNCServerST.cxx:614
No locals.
#15 0x0000564d97a0c18c in rfb::Timer::checkTimeouts () at ./common/rfb/Timer.cxx:71
timer = 0x7ffd1d8ba288
before = {tv_sec = 1594306122, tv_usec = 667682}
start = {tv_sec = 1594306122, tv_usec = 667682}
#16 0x0000564d979f6b0e in main (argc=<optimized out>, argv=<optimized out>) at ./unix/x0vncserver/x0vncserver.cxx:363
tv = {tv_sec = 0, tv_usec = 0}
wfds = {fds_bits = {0 <repeats 16 times>}}
i = <optimized out>
wait_ms = <optimized out>
rfds = {fds_bits = {0 <repeats 16 times>}}
sockets = std::__cxx11::list = {[0] = 0x564d98a29730}
clients_connected = <optimized out>
n = <optimized out>
geo = {static m_geometryParam = {<rfb::VoidParameter> = {_vptr.VoidParameter = 0x564d97a5a270 <vtable for rfb::StringParameter+16>, _next = 0x0, immutable = false, name = 0x564d97a3c041 "Geometry",
description = 0x564d97a3c098 "Screen area shown to VNC clients. Format is <width>x<height>+<offset_x>+<offset_y>, more information in man X, section GEOMETRY SPECIFICATIONS. If the argument is empty, full screen is shown to VNC cl"..., mutex = 0x564d989ef9f0}, value = 0x564d989ef930 "",
def_value = 0x564d97a3d80f ""}, m_fullWidth = 4480, m_fullHeight = 1440, m_rect = {tl = {x = 0, y = 0}, br = {x = 4480, y = 1440}}}
hostsData = <optimized out>
fileTcpFilter = {<network::TcpFilter> = {<network::ConnectionFilter> = {_vptr.ConnectionFilter = 0x564d97a59a68 <vtable for FileTcpFilter+16>}, filter = std::__cxx11::list = {[0] = {action = network::TcpFilter::Reject, address = {u = {sa = {sa_family = 0, sa_data = '\000' <repeats 13 times>}, sin = {
sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}, sin6 = {sin6_family = 0, sin6_port = 0, sin6_flowinfo = 0, sin6_addr = {__in6_u = {__u6_addr8 = '\000' <repeats 15 times>, __u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, __u6_addr32 = {0, 0, 0, 0}}},
sin6_scope_id = 0}}}, prefixlen = 0, mask = {u = {sa = {sa_family = 0, sa_data = '\000' <repeats 13 times>}, sin = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = "\000\000\000\000\000\000\000"}, sin6 = {sin6_family = 0, sin6_port = 0, sin6_flowinfo = 0, sin6_addr = {
__in6_u = {__u6_addr8 = '\000' <repeats 15 times>, __u6_addr16 = {0, 0, 0, 0, 0, 0, 0, 0}, __u6_addr32 = {0, 0, 0, 0}}}, sin6_scope_id = 0}}}}}}, fileName = 0x564d989ed7c0 "", lastModTime = 0}
sched = {m_interval = 30, m_maxload = 35, m_initialState = false, m_passStarted = {m_timeval = {tv_sec = 1594306122, tv_usec = 363512}}, m_ratedDuration = 500, m_sleepStarted = {m_timeval = {tv_sec = 1594306122, tv_usec = 666590}}, m_sleeping = false, m_sleptThisPass = 66, m_errors = {62, 187, 448, 422,
397, 374, 5, 8}, m_errorSum = 1903, m_errorAbsSum = 1903, m_durations = {92, 217, 478, 452, 427, 404, 35, 38}, m_durationSum = 2143, m_slept = {15, 28, 149, 186, 177, 127, 19, 2}, m_sleptSum = 703, m_idx = 6, m_count = 14}
desktop = {<rfb::SDesktop> = {<rfb::InputHandler> = {_vptr.InputHandler = 0x564d97a59a90 <vtable for XDesktop+16>}, <No data fields>}, <TXGlobalEventHandler> = {_vptr.TXGlobalEventHandler = 0x564d97a59b20 <vtable for XDesktop+160>}, <QueryResultCallback> = {
_vptr.QueryResultCallback = 0x564d97a59b38 <vtable for XDesktop+184>}, dpy = 0x564d98a0b2e0, geometry = 0x7ffd1d8b9fe0, pb = 0x564d98a2f150, server = 0x7ffd1d8ba050, queryConnectDialog = 0x0, queryConnectSock = 0x0, oldButtonMask = 0, haveXtest = true, haveDamage = true, maxButtons = 8,
pressedKeys = std::map with 0 elements, running = true, damage = 69206026, xdamageEventBase = 91, xkbEventBase = 85, xfixesEventBase = 87, xrandrEventBase = 89, outputIdMap = std::map with 2 elements = {[770] = 1804289383, [772] = 846930886}, randrSyncSerial = 0, ledMasks = {4, 2, 1}, ledState = 2,
codeMap = 0x564d97a3c400 <code_map_qnum_to_xorgevdev>, codeMapLen = 254}
server = {<rfb::VNCServer> = {<rfb::UpdateTracker> = {_vptr.UpdateTracker = 0x564d97a5a608 <vtable for rfb::VNCServerST+16>}, <network::SocketServer> = {_vptr.SocketServer = 0x564d97a5a6f0 <vtable for rfb::VNCServerST+248>}, <No data fields>}, <rfb::Timer::Callback> = {
_vptr.Callback = 0x564d97a5a738 <vtable for rfb::VNCServerST+320>}, blacklist = {blm = std::map with 0 elements}, blHosts = 0x7ffd1d8ba068, desktop = 0x7ffd1d8ba470, desktopStarted = true, blockCounter = 0, pb = 0x564d98a2f150, screenLayout = {screens = std::__cxx11::list = {[0] = {id = 1804289383,
dimensions = {tl = {x = 2560, y = 360}, br = {x = 4480, y = 1440}}, flags = 0}, [1] = {id = 846930886, dimensions = {tl = {x = 0, y = 0}, br = {x = 2560, y = 1440}}, flags = 0}}}, ledState = 2, name = {buf = 0x564d98a2a820 "x0vncserver"}, clients = std::__cxx11::list = {[0] = 0x564d98a36c80},
pointerClient = 0x0, clipboardClient = 0x0, clipboardRequestors = empty std::__cxx11::list, closingSockets = empty std::__cxx11::list, comparer = 0x564d98bd8800, cursorPos = {x = 818, y = 1439}, cursor = 0x564d98bd8690, renderedCursor = {<rfb::PixelBuffer> = {
_vptr.PixelBuffer = 0x564d97a5a800 <vtable for rfb::RenderedCursor+16>, format = {bpp = 32, depth = 24, trueColour = true, bigEndian = false, redMax = 255, greenMax = 255, blueMax = 255, redShift = 16, greenShift = 8, blueShift = 0, redBits = 8, greenBits = 8, blueBits = 8, maxBits = 8, minBits = 8,
endianMismatch = false,
static upconvTable = "\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377"..., static downconvTable = <same as static member of an already seen type>,
static _init = {<No data fields>}}, width_ = 4480, height_ = 1440}, buffer = {<rfb::FullFramePixelBuffer> = {<rfb::ModifiablePixelBuffer> = {<rfb::PixelBuffer> = {_vptr.PixelBuffer = 0x564d97a5a520 <vtable for rfb::ManagedPixelBuffer+16>, format = {bpp = 32, depth = 24, trueColour = true,
bigEndian = false, redMax = 255, greenMax = 255, blueMax = 255, redShift = 16, greenShift = 8, blueShift = 0, redBits = 8, greenBits = 8, blueBits = 8, maxBits = 8, minBits = 8, endianMismatch = false,
static upconvTable = "\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377\000\377"..., static downconvTable = <same as static member of an already seen type>,
static _init = {<No data fields>}}, width_ = 15, height_ = 21}, <No data fields>}, data = 0x564d98bf5330 "\r\r\t", stride = 15}, data_ = 0x564d98bf5330 "\r\r\t", datasize = 1260}, offset = {x = 957, y = 585}}, renderedCursorInvalid = true,
keyRemapper = 0x564d97a5e2c0 <rfb::KeyRemapper::defInstance>, idleTimer = {dueTime = {tv_sec = 15481355650793524, tv_usec = 12103604389871656}, timeoutMs = 2949164, cb = 0x7ffd1d8ba060, static pending = {<std::__cxx11::_List_base<rfb::Timer*, std::allocator<rfb::Timer*> >> = {
_M_impl = {<std::allocator<std::_List_node<rfb::Timer*> >> = {<__gnu_cxx::new_allocator<std::_List_node<rfb::Timer*> >> = {<No data fields>}, <No data fields>}, _M_node = {<std::__detail::_List_node_base> = {_M_next = 0x564d98bf59e0, _M_prev = 0x564d98a2fdd0}, _M_size = 3}}}, <No data fields>}},
disconnectTimer = {dueTime = {tv_sec = 10977687302897700, tv_usec = 7599936041975832}, timeoutMs = 1900572, cb = 0x7ffd1d8ba060, static pending = {<std::__cxx11::_List_base<rfb::Timer*, std::allocator<rfb::Timer*> >> = {
_M_impl = {<std::allocator<std::_List_node<rfb::Timer*> >> = {<__gnu_cxx::new_allocator<std::_List_node<rfb::Timer*> >> = {<No data fields>}, <No data fields>}, _M_node = {<std::__detail::_List_node_base> = {_M_next = 0x564d98bf59e0, _M_prev = 0x564d98a2fdd0}, _M_size = 3}}}, <No data fields>}},
connectTimer = {dueTime = {tv_sec = 0, tv_usec = -1}, timeoutMs = -256, cb = 0x7ffd1d8ba060, static pending = {<std::__cxx11::_List_base<rfb::Timer*, std::allocator<rfb::Timer*> >> = {
_M_impl = {<std::allocator<std::_List_node<rfb::Timer*> >> = {<__gnu_cxx::new_allocator<std::_List_node<rfb::Timer*> >> = {<No data fields>}, <No data fields>}, _M_node = {<std::__detail::_List_node_base> = {_M_next = 0x564d98bf59e0, _M_prev = 0x564d98a2fdd0}, _M_size = 3}}}, <No data fields>}},
frameTimer = {dueTime = {tv_sec = 1594306122, tv_usec = 666743}, timeoutMs = 16, cb = 0x7ffd1d8ba060, static pending = {<std::__cxx11::_List_base<rfb::Timer*, std::allocator<rfb::Timer*> >> = {
_M_impl = {<std::allocator<std::_List_node<rfb::Timer*> >> = {<__gnu_cxx::new_allocator<std::_List_node<rfb::Timer*> >> = {<No data fields>}, <No data fields>}, _M_node = {<std::__detail::_List_node_base> = {_M_next = 0x564d98bf59e0, _M_prev = 0x564d98a2fdd0}, _M_size = 3}}}, <No data fields>}}}
dpy = 0x564d98a0b2e0
dpyStr = {buf = 0x564d989ecb80 ""}
listeners = std::__cxx11::list = {[0] = 0x564d98a2aa60, [1] = 0x564d98a2e640}
This is with 38726ce083db1a9227325bf87989513499bfa698.
Hm... that trace shows it in the middle of sending an update and seems to be working just fine.
Could this be a client issue? Have you tried more than one client?
It can't be purely a client issue because while it's happening I can't connect another client and because the client is not dropped due to IdleTimeout
.
I haven't yet tried having several clients attached simultaneously to see if it locks up for all of them.
Alright, let's try this; Do the gdb
thing again. But after the bt
run the command finish
. It will wait for the current function to exit and then print a line once it is done. Do that as many times as you can and let us know where it stops.
(Deleted)
I'm afraid that is an entirely different issue as your trace is in code specific to Xvnc. Please file a new entry here on Github with your details. Also please remove/edit your comment here so we can avoid things that aren't related to the original issue.
Describe the bug Intermittently, but about once every few minutes, x0tigervncserver locks up -- the network connection between existing clients and the server stays up, but no input is processed and the view is not refreshed. The server doesn't respond to new connections.
IdleTimeout
doesn't kick in.To Reproduce Happens randomly, but apparently only during active use, not when the client is idle.
Client (please complete the following information):
Server (please complete the following information):
ssh otherhost env DISPLAY=:0 x0tigervncserver PasswordFile=/home/myuser/.vnc/passwd -RawKeyboard -IdleTimeout 30 -Log "'*:stderr:100'" -AlwaysShared -AcceptSetDesktopSize=0 -ClientWaitTimeMillis 500
Additional context Last few lines of server output:
Output stops here despite client activity.
stracing the server shows: