Vim crashes after ycmd #593

Closed
oblitum opened this Issue Oct 18, 2013 · 23 comments

Projects

None yet

3 participants

@oblitum
Collaborator
oblitum commented Oct 18, 2013

I've switched to ycmd and I perceived (I think) some random crashes from time to time, it was sowewhat difficult to reduce the occasion where it would happen consistently, I have a consistent crash in the following situation,

typed boost::bima:

then tab, tab, tab:

in the fourth tab, vim crashes.

It's aways this situation, going through the popup options with tab, a random crash occurs.
Still not sure whether ycmd is the real cause.

@oblitum
Collaborator
oblitum commented Oct 18, 2013

Vim Version:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Sep  7 2013 16:21:31)
Correções incluídas: 1-22
Compilado por francisco@oblita.com
Versão enorme com interface GTK2.  Recursos incluídos (+) ou não (-):
+acl             +farsi           +mouse_netterm   +syntax
+arabic          +file_in_path    +mouse_sgr       +tag_binary
+autocmd         +find_in_path    -mouse_sysmouse  +tag_old_static
+balloon_eval    +float           +mouse_urxvt     -tag_any_white
+browse          +folding         +mouse_xterm     -tcl
++builtin_terms  -footer          +multi_byte      +terminfo
+byte_offset     +fork()          +multi_lang      +termresponse
+cindent         +gettext         -mzscheme        +textobjects
+clientserver    -hangul_input    +netbeans_intg   +title
+clipboard       +iconv           +path_extra      +toolbar
+cmdline_compl   +insert_expand   +perl            +user_commands
+cmdline_hist    +jumplist        +persistent_undo +vertsplit
+cmdline_info    +keymap          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         +profile         +visualextra
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
+cursorbind      +listcmds        +quickfix        +wildignore
+cursorshape     +localmap        +reltime         +wildmenu
+dialog_con_gui  +lua             +rightleft       +windows
+diff            +menu            +ruby            +writebackup
+digraphs        +mksession       +scrollbind      +X11
+dnd             +modify_fname    +signs           -xfontset
-ebcdic          +mouse           +smartindent     +xim
+emacs_tags      +mouseshape      -sniff           +xsmp_interact
+eval            +mouse_dec       +startuptime     +xterm_clipboard
+ex_extra        -mouse_gpm       +statusline      -xterm_save
+extra_search    -mouse_jsbterm   -sun_workshop    -xpm
    arquivo vimrc de sistema: "$VIM/vimrc"
    arquivo vimrc do usuário: "$HOME/.vimrc"
 2º arquivo vimrc do usuário: "~/.vim/vimrc"
     arquivo exrc do usuário: "$HOME/.exrc"
   arquivo gvimrc de sistema: "$VIM/gvimrc"
   arquivo gvimrc do usuário: "$HOME/.gvimrc"
2º arquivo gvimrc do usuário: "~/.vim/gvimrc"
  arquivo de menu do sistema: "$VIMRUNTIME/menu.vim"
            padrão para $VIM: "/usr/local/share/vim"
Compilação: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK  -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/harfbuzz   -I/usr/local/include  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Vinculação: gcc   -L. -L/home/francisco/.rbenv/versions/2.0.0-p247/lib  -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E   -L/usr/local/lib -Wl,--as-needed -o vim   -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0   -lSM -lICE -lXt -lX11 -lXdmcp -lSM -lICE  -lm -ltinfo -lnsl   -ldl  -L/usr/lib -llua5.1 -Wl,-E  -fstack-protector -L/usr/local/lib  -L/usr/lib/perl/5.14/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions   -Wl,-R -Wl,/home/francisco/.rbenv/versions/2.0.0-p247/lib -L/home/francisco/.rbenv/versions/2.0.0-p247/lib -lruby-static -lpthread -lrt -ldl -lcrypt -lm  -L/home/francisco/.rbenv/versions/2.0.0-p247/lib

Ubuntu 13.04, Clang version 3.4 (trunk 190255).

@Valloric
Owner

I'm going to have to take a closer look at this, but at first glance, I'd put my money on a Vim bug. The ycmd server cannot crash your Vim because it runs inside a separate process; the ycm client code running inside Vim gets JSON from ycmd.

This is then transformed into data that is sent to Vim for display as a completion menu. The fact that the crash happens as you select an item in the completion menu very strongly suggests that this is a Vim bug. No YCM code runs when you tab through the menu, only Vim-internal code.

Try updating to the latest Vim version and see if you can still repro this.

@oblitum
Collaborator
oblitum commented Oct 18, 2013

@Valloric I know the separation between client and server, the question is that I wasn't suffering this before, and haven't updated Vim, so I thought it could be something to do with the client, more specifically filling the menu with data Vim doesn't like.

@oblitum
Collaborator
oblitum commented Oct 18, 2013

I'll try a Vim update to see whether it gets fixed.

@Valloric
Owner

It might be caused by filling the menu with data Vim doesn't like, but that would still be a bug in Vim because Vim shouldn't crash in such a situation.

That being said, YCM would then try to work around that Vim bug.

@oblitum
Collaborator
oblitum commented Oct 18, 2013

Just updated to tip of trunk, same problem:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 18 2013 00:12:00)
Correções incluídas: 1-52
Compilado por francisco@oblita.com
Versão enorme com interface GTK2.  Recursos incluídos (+) ou não (-):
+acl             +farsi           +mouse_netterm   +syntax
+arabic          +file_in_path    +mouse_sgr       +tag_binary
+autocmd         +find_in_path    -mouse_sysmouse  +tag_old_static
+balloon_eval    +float           +mouse_urxvt     -tag_any_white
+browse          +folding         +mouse_xterm     -tcl
++builtin_terms  -footer          +multi_byte      +terminfo
+byte_offset     +fork()          +multi_lang      +termresponse
+cindent         +gettext         -mzscheme        +textobjects
+clientserver    -hangul_input    +netbeans_intg   +title
+clipboard       +iconv           +path_extra      +toolbar
+cmdline_compl   +insert_expand   +perl            +user_commands
+cmdline_hist    +jumplist        +persistent_undo +vertsplit
+cmdline_info    +keymap          +postscript      +virtualedit
+comments        +langmap         +printer         +visual
+conceal         +libcall         +profile         +visualextra
+cryptv          +linebreak       +python          +viminfo
+cscope          +lispindent      -python3         +vreplace
+cursorbind      +listcmds        +quickfix        +wildignore
+cursorshape     +localmap        +reltime         +wildmenu
+dialog_con_gui  -lua             +rightleft       +windows
+diff            +menu            +ruby            +writebackup
+digraphs        +mksession       +scrollbind      +X11
+dnd             +modify_fname    +signs           -xfontset
-ebcdic          +mouse           +smartindent     +xim
+emacs_tags      +mouseshape      -sniff           +xsmp_interact
+eval            +mouse_dec       +startuptime     +xterm_clipboard
+ex_extra        -mouse_gpm       +statusline      -xterm_save
+extra_search    -mouse_jsbterm   -sun_workshop    -xpm
    arquivo vimrc de sistema: "$VIM/vimrc"
    arquivo vimrc do usuário: "$HOME/.vimrc"
 2º arquivo vimrc do usuário: "~/.vim/vimrc"
     arquivo exrc do usuário: "$HOME/.exrc"
   arquivo gvimrc de sistema: "$VIM/gvimrc"
   arquivo gvimrc do usuário: "$HOME/.gvimrc"
2º arquivo gvimrc do usuário: "~/.vim/gvimrc"
  arquivo de menu do sistema: "$VIMRUNTIME/menu.vim"
            padrão para $VIM: "/usr/local/share/vim"
Compilação: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK  -pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/harfbuzz   -I/usr/local/include  -g -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1      
Vinculação: gcc   -L. -L/home/francisco/.rbenv/versions/2.0.0-p247/lib  -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,-E   -L/usr/local/lib -Wl,--as-needed -o vim   -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0   -lSM -lICE -lXt -lX11 -lXdmcp -lSM -lICE  -lm -ltinfo -lnsl   -ldl   -Wl,-E  -fstack-protector -L/usr/local/lib  -L/usr/lib/perl/5.14/CORE -lperl -ldl -lm -lpthread -lcrypt -L/usr/lib/python2.7/config-x86_64-linux-gnu -lpython2.7 -lpthread -ldl -lutil -lm -Xlinker -export-dynamic -Wl,-O1 -Wl,-Bsymbolic-functions   -Wl,-R -Wl,/home/francisco/.rbenv/versions/2.0.0-p247/lib -L/home/francisco/.rbenv/versions/2.0.0-p247/lib -lruby-static -lpthread -lrt -ldl -lcrypt -lm  -L/home/francisco/.rbenv/versions/2.0.0-p247/lib
@oblitum
Collaborator
oblitum commented Oct 18, 2013

I had switched back to master and rebuild, no problems, then switched back to ycmd and rebuild, the issue is triggered.

@oblitum
Collaborator
oblitum commented Oct 18, 2013

on purpose, I'd like to comment on a kind of feature request, anytime Vim crashes one gets a leaked server instance, I then must go to system monitor and terminate the correspoding instance to the crashed Vim instance. It would be nice to have some kind of seppuku from the server part when a Vim client dies.

@Valloric
Owner

It would be nice to have some kind of seppuku from the server part when a Vim client dies.

This is actually already on my internal TODO list. There'll be a sort of suicide timer that will kill the server when no request has been received for some (configurable) time.

@oblitum
Collaborator
oblitum commented Oct 18, 2013

I think I hit the target, the other stuff that shows up with the "tab tab tab tab" is the preview window and its contents, so to make a simple test I've executed :set completeopt-=preview and now, on "tab tab tab tab", it's not crashing anymore for that case.

@Valloric
Owner

BTW thanks for continuing to test out ycmd and reporting issues. You've been a big help!

@oblitum
Collaborator
oblitum commented Oct 18, 2013

np :-)

@Valloric
Owner

I can't repro this. Here's my test file:

#include <boost/bimap.hpp>


int main() {

  // input goes below here
}

Below the comment, I type boost::bima and then press tab as much as I want, no crash.

Here's my extra conf for testing:

import os

flags = [
'-std=c++11',
'-x',
'c++',
'-isystem',
'../Downloads/boost_1_54_0',
]


def DirectoryOfThisScript():
  return os.path.dirname( os.path.abspath( __file__ ) )


def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
  if not working_directory:
    return list( flags )
  new_flags = []
  make_next_absolute = False
  path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
  for flag in flags:
    new_flag = flag

    if make_next_absolute:
      make_next_absolute = False
      if not flag.startswith( '/' ):
        new_flag = os.path.join( working_directory, flag )

    for path_flag in path_flags:
      if flag == path_flag:
        make_next_absolute = True
        break

      if flag.startswith( path_flag ):
        path = flag[ len( path_flag ): ]
        new_flag = path_flag + os.path.join( working_directory, path )
        break

    if new_flag:
      new_flags.append( new_flag )
  return new_flags


def FlagsForFile( filename ):
  relative_to = DirectoryOfThisScript()
  final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )

  return {
    'flags': final_flags,
    'do_cache': True
  }

As you can see, I have ../Downloads/boost_1_54_0 in my include paths. It points to a fresh, untouched copy of boost 1.54. I'm running the latest ycmd and Vim 7.3.831.

I have noticed you have enable_boost_move... as the last item in your menu; I don't get that.

@oblitum
Collaborator
oblitum commented Oct 18, 2013

I'm using boost from svn repo (compiled with clang & libc++), the last commit is:

r86327 | viboes | 2013-10-16 03:15:51 -0300 (Qua, 16 Out 2013)

My Vim is:

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Oct 18 2013 00:12:00)

changeset:   5404:92c9748e0ccb
tag:         tip
user:        Bram Moolenaar <bram@vim.org>
date:        Sun Oct 06 17:46:56 2013 +0200
summary:     Added tag v7-4-052 for changeset b9c1c1f4cda9

I'm using Ubuntu 13.04.

My .ycm_extra_conf is this:

import os
import ycm_core
from clang_helpers import PrepareClangFlags

# These are the compilation flags that will be used in case there's no
# compilation database set (by default, one is not set).
# CHANGE THIS LIST OF FLAGS. YES, THIS IS THE DROID YOU HAVE BEEN LOOKING FOR.
flags = [
'-x',
'c++',
'-Wall',
'-Wextra',
'-fPIE',
'-D_REENTRANT',
'-std=c++1y',
'-stdlib=libc++',
'-ftemplate-depth=8192',
'-fconstexpr-depth=8192',
'-lcxxrt',
'-ldl',
'-isystem',
'/usr/include/c++/v1',
'-isystem',
'/usr/local/include',
'-isystem',
'/usr/include/x86_64-linux-gnu',
'-isystem',
'/usr/include',

'-I',
'/usr/local/src/yeppp/1.0.0/library/headers',

'-I',
'/opt/qt/5.1.2/linux/mkspecs/linux-clang',
'-I',
'/opt/qt/5.1.2/linux/include',
'-I',
'/opt/qt/5.1.2/linux/include/QtCLucene',
'-I',
'/opt/qt/5.1.2/linux/include/QtConcurrent',
'-I',
'/opt/qt/5.1.2/linux/include/QtCore',
'-I',
'/opt/qt/5.1.2/linux/include/QtDBus',
'-I',
'/opt/qt/5.1.2/linux/include/QtDeclarative',
'-I',
'/opt/qt/5.1.2/linux/include/QtDesigner',
'-I',
'/opt/qt/5.1.2/linux/include/QtDesignerComponents',
'-I',
'/opt/qt/5.1.2/linux/include/QtGui',
'-I',
'/opt/qt/5.1.2/linux/include/QtHelp',
'-I',
'/opt/qt/5.1.2/linux/include/QtMultimedia',
'-I',
'/opt/qt/5.1.2/linux/include/QtMultimediaQuick_p',
'-I',
'/opt/qt/5.1.2/linux/include/QtMultimediaWidgets',
'-I',
'/opt/qt/5.1.2/linux/include/QtNetwork',
'-I',
'/opt/qt/5.1.2/linux/include/QtOpenGL',
'-I',
'/opt/qt/5.1.2/linux/include/QtOpenGLExtensions',
'-I',
'/opt/qt/5.1.2/linux/include/QtPlatformSupport',
'-I',
'/opt/qt/5.1.2/linux/include/QtPrintSupport',
'-I',
'/opt/qt/5.1.2/linux/include/QtQml',
'-I',
'/opt/qt/5.1.2/linux/include/QtQuick',
'-I',
'/opt/qt/5.1.2/linux/include/QtQuickParticles',
'-I',
'/opt/qt/5.1.2/linux/include/QtQuickTest',
'-I',
'/opt/qt/5.1.2/linux/include/QtScript',
'-I',
'/opt/qt/5.1.2/linux/include/QtScriptTools',
'-I',
'/opt/qt/5.1.2/linux/include/QtSensors',
'-I',
'/opt/qt/5.1.2/linux/include/QtSerialPort',
'-I',
'/opt/qt/5.1.2/linux/include/QtSql',
'-I',
'/opt/qt/5.1.2/linux/include/QtSvg',
'-I',
'/opt/qt/5.1.2/linux/include/QtTest',
'-I',
'/opt/qt/5.1.2/linux/include/QtUiTools',
'-I',
'/opt/qt/5.1.2/linux/include/QtV8',
'-I',
'/opt/qt/5.1.2/linux/include/QtWebKit',
'-I',
'/opt/qt/5.1.2/linux/include/QtWebKitWidgets',
'-I',
'/opt/qt/5.1.2/linux/include/QtWidgets',
'-I',
'/opt/qt/5.1.2/linux/include/QtX11Extras',
'-I',
'/opt/qt/5.1.2/linux/include/QtXml',
'-I',
'/opt/qt/5.1.2/linux/include/QtXmlPatterns'
]

# Set this to the absolute path to the folder (NOT the file!) containing the
# compile_commands.json file to use that instead of 'flags'. See here for
# more details: http://clang.llvm.org/docs/JSONCompilationDatabase.html
#
# Most projects will NOT need to set this to anything; you can just change the
# 'flags' list of compilation flags. Notice that YCM itself uses that approach.
compilation_database_folder = ''

if compilation_database_folder:
  database = ycm_core.CompilationDatabase( compilation_database_folder )
else:
  database = None


def DirectoryOfThisScript():
  return os.path.dirname( os.path.abspath( __file__ ) )


def MakeRelativePathsInFlagsAbsolute( flags, working_directory ):
  if not working_directory:
    return flags
  new_flags = []
  make_next_absolute = False
  path_flags = [ '-isystem', '-I', '-iquote', '--sysroot=' ]
  for flag in flags:
    new_flag = flag

    if make_next_absolute:
      make_next_absolute = False
      if not flag.startswith( '/' ):
        new_flag = os.path.join( working_directory, flag )

    for path_flag in path_flags:
      if flag == path_flag:
        make_next_absolute = True
        break

      if flag.startswith( path_flag ):
        path = flag[ len( path_flag ): ]
        new_flag = path_flag + os.path.join( working_directory, path )
        break

    if new_flag:
      new_flags.append( new_flag )
  return new_flags


def FlagsForFile( filename ):
  if database:
    # Bear in mind that compilation_info.compiler_flags_ does NOT return a
    # python list, but a "list-like" StringVec object
    compilation_info = database.GetCompilationInfoForFile( filename )
    final_flags = PrepareClangFlags(
        MakeRelativePathsInFlagsAbsolute(
            compilation_info.compiler_flags_,
            compilation_info.compiler_working_dir_ ),
        filename )
  else:
    relative_to = DirectoryOfThisScript()
    final_flags = MakeRelativePathsInFlagsAbsolute( flags, relative_to )

  return {
    'flags': final_flags,
    'do_cache': True
  }

My .vimrc is this: https://gist.github.com/oblitum/5565974.

YCM installation was through:

./install.sh --clang-completer --system-libclang

My llvm/clang version is clang version 3.4 (trunk 190255) (compiled from sources).

My libc++ version is:

r191148 | hhinnant | 2013-09-21 18:26:37 -0300 (Sat, 21 Sep 2013)

If you get unable to reproduce this, I think I may have to figure it out myself, I only know this is related with the preview window, only with ycmd.

@Valloric
Owner

Can you repro the issue with the test case/extra conf I posted?

@oblitum
Collaborator
oblitum commented Oct 21, 2013

I have inspected this is a Vim bug, will report it upstream as soon as I can.

@oblitum oblitum closed this Oct 21, 2013
@oblitum
Collaborator
oblitum commented Oct 21, 2013

for reference, this is the Vim thread discussing this issue:

https://groups.google.com/forum/#!topic/vim_dev/DBtKhz7gKL0

@Valloric
Owner

Thanks for reporting this upstream (and providing a patch)!

@Valloric
Owner

If anyone has this problem, you need to update to latest Syntastic.

@Valloric Valloric added a commit that referenced this issue Dec 10, 2013
@Valloric Not using Syntastic lazy redraw anymore
This gets rid of the annoying flashing (issue #669), but reverts the workaround
for a rare Vim crash bug (issue #593). We can't have both. Update to latest Vim
to not get the crash bug.

Fixes #669.
4d8fea4
@Valloric Valloric added a commit that referenced this issue Dec 10, 2013
@Valloric New entry to FAQ about Vim crash
Happens sometimes when users tab through the completion menu. Related to #593.
1e99f51
@Valloric Valloric added a commit that referenced this issue Dec 27, 2013
@Valloric Revert "Not using Syntastic lazy redraw anymore"
This reverts commit 4d8fea4.

Since the commit we are reverting didn't resolve #669, we are reverting it to
fix #593 (again).
afb70bf
@lekishvili

oblitum sorry but which color scheme do you use?

@oblitum
Collaborator
oblitum commented May 26, 2014

@lekishvili I use gruvbox, this is my .vimrc: https://gist.github.com/oblitum/5565974

@oblitum
Collaborator
oblitum commented May 27, 2014

@lekishvili from discussion in #1000 I just started using octol/vim-cpp-enhanced-highlight too =)

@lekishvili

@oblitum thank you )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment