将指针强制转换为 lldb 中的类型

Posted

技术标签:

【中文标题】将指针强制转换为 lldb 中的类型【英文标题】:cast a pointer to a type in lldb 【发布时间】:2018-05-04 03:43:17 【问题描述】:

我想调试第三方c++ lib,是否可以将指针强制转换为可打印类型?

我试过了

(lldb) expr static_cast<AGInfo*>(0x0000002fcdccc060)

但它显示错误

error: cannot cast from type 'long' to pointer type 'mxnet::Imperative::AGInfo *'

有什么办法吗?

谢谢

【问题讨论】:

【参考方案1】:

lldb 使用 clang 作为其表达式解析器,因此它非常严格地遵循 C++,只进行了一些修改。 clang 不允许你做你在源代码中尝试的事情:

 > cat foo.cpp
struct Something

  int first;
  int second;
;

int
main()

  Something mySomething = 10, 30;
  long ptr_val = (long) &mySomething;
  Something *some_ptr = static_cast<Something *>(ptr_val);
  return some_ptr->first;

 > clang++ -g -O0 -o foo foo.cpp
foo.cpp:12:25: error: cannot cast from type 'long' to pointer type 'Something *'
  Something *some_ptr = static_cast<Something *>(ptr_val);
                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.

所以它在 lldb 中也不起作用。

幸运的是,C++ 在 C 风格的转换中没有那么严格,所以相同的代码但有:

  Something *some_ptr = (Something *) ptr_val;

在实际源代码中编译,并将在 lldb 表达式解析器中工作。

【讨论】:

以上是关于将指针强制转换为 lldb 中的类型的主要内容,如果未能解决你的问题,请参考以下文章

关于继承中的强制类型转换

C语言强制类型转换

c和c++中,对结构体进行强制类型转换!

在C中增加强制转换的void指针

Java中的强制类型转换是如何转换的?

Java中的强制类型转换是如何转换的?