【发布时间】:2021-03-14 06:22:30
【问题描述】:
我正在尝试获取指向每条指令的指针,这可以通过以下方式实现:
Value* ptr = dyn_cast<Value>(&inst);
但是,在使用 cmake 运行已编译的 C++ 程序时,我不断遇到分段错误。在调试模式下,我收到以下错误消息:
opt-11: /usr/lib/llvm-11/include/llvm/IR/User.h:170: llvm::Value* llvm::User::getOperand(unsigned int)
const: Assertion `i < NumUserOperands && "getOperand() out of range!"' failed.
在LLVM doc 中,这是指向断言源的代码块:
Value *getOperand(unsigned i) const {
assert(i < NumUserOperands && "getOperand() out of range!");
return getOperandList()[i];
}
我在程序中从getOperand() 获取的每个变量都添加了空检查,但错误仍然存在。有谁知道它为什么会发生以及如何解决它?
【问题讨论】:
-
1.运行 Valgrind。 2.如果你想用 LLVM 做很多事情,构建一个带有调试符号的树。
-
而 FWIW,使用
dyn_cast<>转换为Value没有意义。Value是根类。如果您有Instruction*,那么您已经拥有Value*,那么dyn_cast<>将无事可做。 -
感谢 cmets!我是 C++ 调试的新手,您能详细说明一下使用调试符号构建树吗?
-
你说得对,之前我认为问题的根源在于指令指针,但事实并非如此。
标签: c++ clang llvm llvm-ir llvm-c++-api