使LLDB将地址重新解释为指向模板实例化类型对象的指针
Make LLDB reinterpret address as pointer to an object whose type is a template instantiation
在调试时,我在内存中有一个地址,并且知道驻留在该地址上的对象的类型,并且我希望调试器显示该对象的实例。对于不是模板的类型,可以通过print命令来完成,但对于模板实例化的类型,似乎会失败。
请看下面的示例代码:
template<typename T>
class X
{
public:
X() {
printf("an");
}
};
class Y
{
public:
Y() {
printf("an");
}
};
int main(void)
{
X<int> x;
Y y;
return 1;
}
当我运行程序,中断main并尝试将随机有效地址解释为指向X和Y对象的指针时,前者失败了:
(lldb) p *(Y*)0x0000000100000ee6
(Y) $0 = {}
(lldb) p *(X<int>*)0x0000000100000ee6
warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.
error: use of undeclared identifier 'X'
error: expected '(' for function-style cast or type construction
error: expected expression
是否有任何方法如何在lldb中做到这一点?(编辑:Mac OS X lldb-360.1.65和lldb-310.2.37)
c++的调试信息目前并不抽象地表示模板,它只讨论程序中存在的特定模板实例化。但是lldb的表达式命令使用一个真正的c++解析器(clang),当解析像您尝试的表达式时,它希望首先将X视为抽象模板。因为我们不知道它们,所以我们不能满足clang对X的类型请求,这就是为什么你看到的错误是"未声明的标识符X"。
可以通过为要以这种方式强制转换的指针类型创建一个typedef来解决这个问题。这不是很令人满意,因为你必须提前完成它,而且你必须在代码中的某个地方使用类型定义,因为—为了保持调试信息的大小可管理—clang不会为不使用的类型发出调试信息。但它确实有效,例如,我在示例代码中添加:
typedef X<int> * x_int_ptr;
,然后在main:
x_int_ptr bar = (x_int_ptr) &x;
以确保它被记录,然后在ldb中我可以这样做:
(lldb) expr *((x_int_ptr) 0x00007fff5fbff798)
(X<int>) $1 = {}
相关文章:
- 检查某些类型是否是模板类 std::optional 的实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 实例化模板时,我是否必须显式显示参数包中的类型?
- 在实例化之前推断函数模板的返回类型
- 对象实例化与类型C++
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 根据实例化点期望不同的类型
- 类模板实例化中的类型转换
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 实例化多种类型的成员函数模板
- C++ 多态模板类,模板类型对象的实例化
- 从模板实例化/类型推断中查找错误消息的实际来源
- MPL地图实例化类型
- SFINAE将实例化类型限制为std::chrono::duration类型
- 实例化类型模板化类的非类型模板化成员函数
- 使用大括号初始化列表或传统的 ctor 语法实例化类型
- 何时检查C++模板实例化类型
- 使LLDB将地址重新解释为指向模板实例化类型对象的指针
- 标准::shared_ptr 失去常量的实例化类型
- c++模板:我可以/如何使用结构体作为模板的实例化类型