Add --debug to disable libclang crash recovery

We can add more debug facility later.
This commit is contained in:
Fangrui Song 2018-01-24 23:32:40 -08:00
parent 706a3d0017
commit db1f707027
2 changed files with 17 additions and 10 deletions

View File

@ -49,6 +49,7 @@
// items per second completed and scales up/down number of running threads. // items per second completed and scales up/down number of running threads.
std::string g_init_options; std::string g_init_options;
bool g_debug;
namespace { namespace {
@ -417,6 +418,7 @@ int main(int argc, char** argv) {
// std::this_thread::sleep_for(std::chrono::seconds(10)); // std::this_thread::sleep_for(std::chrono::seconds(10));
PlatformInit(); PlatformInit();
g_debug = HasOption(options, "--debug");
IndexInit(); IndexInit();
bool print_help = true; bool print_help = true;
@ -435,6 +437,7 @@ int main(int argc, char** argv) {
} }
if (HasOption(options, "--test-unit")) { if (HasOption(options, "--test-unit")) {
g_debug = true;
print_help = false; print_help = false;
doctest::Context context; doctest::Context context;
context.applyCommandLine(argc, argv); context.applyCommandLine(argc, argv);
@ -444,6 +447,7 @@ int main(int argc, char** argv) {
} }
if (HasOption(options, "--test-index")) { if (HasOption(options, "--test-index")) {
g_debug = true;
print_help = false; print_help = false;
if (!RunIndexTests(options["--test-index"], !HasOption(options, "--ci"))) if (!RunIndexTests(options["--test-index"], !HasOption(options, "--ci")))
return -1; return -1;
@ -485,17 +489,22 @@ int main(int argc, char** argv) {
std::cout std::cout
<< R"help(cquery is a low-latency C/C++/Objective-C language server. << R"help(cquery is a low-latency C/C++/Objective-C language server.
Command line options: Mode:
--language-server --language-server
Run as a language server. This implements the language server Run as a language server. This implements the language server
spec over STDIN and STDOUT. spec over STDIN and STDOUT.
--init <initializationOptions>
Override user provided initialization options.
--test-unit Run unit tests. --test-unit Run unit tests.
--test-index <opt_filter_path> --test-index <opt_filter_path>
Run index tests. opt_filter_path can be used to specify which Run index tests. opt_filter_path can be used to specify which
test to run (ie, "foo" will run all tests which contain "foo" test to run (ie, "foo" will run all tests which contain "foo"
in the path). If not provided all tests are run. in the path). If not provided all tests are run.
Other command line options:
--debug Disable libclang crash recovery so that in case of libclang or
indexer callback issue, the process will crash and we can
get a stack trace.
--init <initializationOptions>
Override user provided initialization options.
--log-stdin-stdout-to-stderr --log-stdin-stdout-to-stderr
Print stdin and stdout messages to stderr. This is a aid for Print stdin and stdout messages to stderr. This is a aid for
developing new language clients, as it makes it easier to figure developing new language clients, as it makes it easier to figure

View File

@ -17,6 +17,9 @@
// TODO: See if we can use clang_indexLoc_getFileLocation to get a type ref on // TODO: See if we can use clang_indexLoc_getFileLocation to get a type ref on
// |Foobar| in DISALLOW_COPY(Foobar) // |Foobar| in DISALLOW_COPY(Foobar)
// Defined in command_line.cc
extern bool g_debug;
namespace { namespace {
constexpr bool kIndexStdDeclarations = true; constexpr bool kIndexStdDeclarations = true;
@ -2014,11 +2017,6 @@ optional<std::vector<std::unique_ptr<IndexFile>>> ParseWithTu(
CXIndexAction index_action = clang_IndexAction_create(index->cx_index); CXIndexAction index_action = clang_IndexAction_create(index->cx_index);
// NOTE: libclang re-enables crash recovery whenever a new index is created.
// To have clang crash toggle crash recovery right before calling
// clang_indexTranslationUnit.
// clang_toggleCrashRecovery(0);
// |index_result| is a CXErrorCode instance. // |index_result| is a CXErrorCode instance.
int index_result = clang_indexTranslationUnit( int index_result = clang_indexTranslationUnit(
index_action, &param, &callback, sizeof(IndexerCallbacks), index_action, &param, &callback, sizeof(IndexerCallbacks),
@ -2090,6 +2088,7 @@ void ConcatTypeAndName(std::string& type, const std::string& name) {
void IndexInit() { void IndexInit() {
clang_enableStackTraces(); clang_enableStackTraces();
if (!g_debug)
clang_toggleCrashRecovery(1); clang_toggleCrashRecovery(1);
} }
@ -2134,7 +2133,6 @@ void ClangSanityCheck() {
const unsigned kIndexOpts = 0; const unsigned kIndexOpts = 0;
CXIndexAction index_action = clang_IndexAction_create(index); CXIndexAction index_action = clang_IndexAction_create(index);
int index_param = 0; int index_param = 0;
clang_toggleCrashRecovery(0);
clang_indexTranslationUnit(index_action, &index_param, &callback, clang_indexTranslationUnit(index_action, &index_param, &callback,
sizeof(IndexerCallbacks), kIndexOpts, tu); sizeof(IndexerCallbacks), kIndexOpts, tu);
clang_IndexAction_dispose(index_action); clang_IndexAction_dispose(index_action);