我一直在尝试运行一些 clang 教程,例如 this one我不断收到我用 GDB 跟踪的段错误:
Starting program: /analyser/a.out PrintFunctions.cpp
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
clang::Builtin::Context::InitializeTarget (this=0x6d1fe8, Target=...) at /opt/llvm/src/llvm/tools/clang/lib/Basic/Builtins.cpp:46
46 /opt/llvm/src/llvm/tools/clang/lib/Basic/Builtins.cpp: No such file or directory.
(gdb) bt
#0 clang::Builtin::Context::InitializeTarget (this=0x6d1fe8, Target=...) at /opt/llvm/src/llvm/tools/clang/lib/Basic/Builtins.cpp:46
#1 0x00007fffedff47ba in clang::Preprocessor::Initialize (this=0x6d1d90, Target=...) at /opt/llvm/src/llvm/tools/clang/lib/Lex/Preprocessor.cpp:181
#2 0x00007ffff0efca72 in clang::CompilerInstance::createPreprocessor (this=0x7fffffffe5d8, TUKind=<optimized out>)
at /opt/llvm/src/llvm/tools/clang/lib/Frontend/CompilerInstance.cpp:306
#3 0x0000000000402bcd in main (argc=2, argv=0x0) at PrintFunctions.cpp:86
(gdb) quit
知道发生了什么吗?
最佳答案
第 1 步。重建 llvm 和 clang:
cmake ... -DLLVM_ENABLE_ASSERTIONS=1
或
cmake ... -DCMAKE_BUILD_TYPE=Debug
后者将允许你实际进入 clang 和 llvm 中的函数,但前者至少会在你跳过初始化或传递错误参数等时给你一些公平的警告,而不是在某些神秘的地方崩溃它实际上正在被使用(通常比断言晚得多)
第 2 步。修复目标信息。此代码在过去几年中已更改过几次,因此您需要查找执行此操作的地方。查看例如 llvm/tools/llc/llc.cpp
中的代码是一个很好的起点。由于这在几乎每个版本中都是不同的,我不会挖掘 2-3 年前的代码来弄清楚你需要做什么,但你确实需要初始化一些目标,否则你的编译将不会成功。如果您启用断言,您很可能会在合适的地方获得断言。
关于c++ - clang 教程 "missing file"上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35543648/