diff --git a/Debugging.md b/Debugging.md index 5762e78..0e9f6b0 100644 --- a/Debugging.md +++ b/Debugging.md @@ -1,24 +1,25 @@ -First of all, use a Debug [[Build]]. It is compiled with `-O0 -g` while the default Release is `-O3`. +First of all, use a [`Debug` build](Build#cmake-options). It is compiled with +`-O0 -g` while the default `Release` build is `-O3`. ### Logs -`-log-file=/tmp/cc.log -v=1` - -`-v=1` dumps command line options used for parsing. +Enable [logging](Customization#--log-filefile----log-file-appendfile) and +[verbose](Customization#-vn) mode when starting the server. ### stderr You can find stderr output in: -* LanguageClient-neovim: `/tmp/LanguageServer.log` (default) -* Emacs lsp-mode: `*lsp-ccls stderr*` buffer. They will also go to `*message*` buffer if `(setq lsp-print-io t)` +* [[LanguageClient-neovim]]: `/tmp/LanguageServer.log` (default) +* Emacs [[lsp-mode]]: `*lsp-ccls stderr*` buffer. They will also go to + `*message*` buffer if `(setq lsp-print-io t)` * VSCode: TODO ### Dump LSP requests/responses On Linux: -```zsh +```sh # sysdig sudo sysdig -As999 --unbuffered -p '%evt.type %proc.name %evt.buffer' "proc.exe contains ccls and fd.type=pipe" | egrep -v '^Content|^$' @@ -28,42 +29,56 @@ strace -s999 -e read,write -fp $(pgrep -fn ccls) ### Stopping at the start to debug early issues -To debug individual LSP requests, you can attach your debugger after ccls has done indexing. However, -for many other issues, such as project file loading (`project.cc`) and C/C++ parsing and indexing `indexer.cc`, you need to set an early breakpoint to be able to trace the code. +To debug individual LSP requests, you can attach your debugger after ccls has +done indexing. However, for many other issues, such as project file loading +(`project.cc`) and C/C++ parsing and indexing `indexer.cc`, you need to set an +early breakpoint to be able to trace the code. -It is recommended to use [[LanguageClient-neovim]] for debugging (even if you use Emacs or VSCode) because it can be started with simple shell command. +It is simplest to use [[LC-neovim]] for debugging (even if you use Emacs or +VSCode) because it can be started with simple shell command. ```vim # vimrc nn ,al :LanguageClientStart ``` -```zsh +```sh rm -r /tmp/ccls && CCLS_TRACEME=1 nvim a.cc +'normal ,al' ``` -The Neovim buffer will hang there because `CCLS_TRACEME=1` causes the `ccls` process to SIGTSTP itself. In another shell, `gdb -p $(pgrep -fn debug/ccls)` +The Neovim buffer will hang there because `CCLS_TRACEME=1` causes the `ccls` +process to SIGTSTP itself. In another shell, `gdb -p $(pgrep -fn debug/ccls)` ### Poor man's breakpoint -Insert an infinite loop `volatile static int z=0;while(!z);` somewhere and ccls will stop there. Attach to the ccls process with `gdb -p $(pgrep -fn ccls)`. Set some breakpoints, use `print` commands, and execute `p z=1` for continuing. +Insert an infinite loop `volatile static int z=0;while(!z);` somewhere and +ccls will stop there. Attach to the ccls process with `gdb -p $(pgrep -fn +ccls)`. Set some breakpoints, use `print` commands, and execute `p z=1` for +continuing. -When setting breakpoints, if several threads may stop on the same breakpoint (e.g. concurrent indexer threads), -execute `set scheduler-locking on`. +When setting breakpoints, if several threads may stop on the same breakpoint +(e.g. concurrent indexer threads), execute `set scheduler-locking on`. ### Using a debugger -Cache files are deleted to avoid possible issues related to stale cache. `CCLS_TRACEME=1` causes the ccls process to stop at the start of `main()`. You may attach to the process with: +Cache files are deleted to avoid possible issues related to stale +cache. `CCLS_TRACEME=1` causes the ccls process to stop at the start of +`main()`. You may attach to the process with: Use `CCLS_TRACEME=s` to `raise(SIGSTOP)`, if `SIGTSTP` does not work. -* `gdb -p $(pgrep -fn ccls)`. Invoke `signal SIGCONT` if you want ccls to continue running after detaching of gdb. -* `lldb -p $(pgrep -fn ccls)`. Invoke `pro sig SIGCONT` when the process resumes (with a `c` command) if you want ccls to continue running after detaching. +* `gdb -p $(pgrep -fn ccls)`. Invoke `signal SIGCONT` if you want ccls to + continue running after detaching of gdb. +* `lldb -p $(pgrep -fn ccls)`. Invoke `pro sig SIGCONT` when the process + resumes (with a `c` command) if you want ccls to continue running after + detaching. ### Indexer issues -`export CCLS_CRASH_RECOVERY=0` disables clang crash recovery. In case of clangIndex issues, you will not see `clang crashed` in the log file but get a process crash. And if you attach a debugger before it crashes, you can get the stack trace. - +`export CCLS_CRASH_RECOVERY=0` disables clang crash recovery. In case of +clangIndex issues, you will not see `clang crashed` in the log file but get a +process crash. And if you attach a debugger before it crashes, you can get the +stack trace. ## Developing