C 给定一个指针,gdb如何获取其类型?

C 给定一个指针,gdb如何获取其类型?,c,gdb,C,Gdb,gdb如何知道指针指向int或struct或任何其他数据类型?gdb无法知道,除非指针来自可以确定其类型的变量或表达式 如果gdb被赋予0x4567789,它不知道这可能指向什么。但是,如果int*p具有该值,gdb可以遵从该值并给出该地址包含的内容。gdb通过读取调试信息(也称为符号表)来了解代码中指针变量的类型,当您使用调试选项(-g)编译时,该信息嵌入到可执行文件中。来自: 什么是expr 打印expression expr的数据类型。expr实际上并没有被计算,并且它内部的任何副作用操作

gdb如何知道指针指向
int
struct
或任何其他数据类型?

gdb无法知道,除非指针来自可以确定其类型的变量或表达式


如果gdb被赋予0x4567789,它不知道这可能指向什么。但是,如果int*p具有该值,gdb可以遵从该值并给出该地址包含的内容。

gdb
通过读取调试信息(也称为符号表)来了解代码中指针变量的类型,当您使用调试选项(
-g
)编译时,该信息嵌入到可执行文件中。

来自:

什么是expr

打印expression expr的数据类型。expr实际上并没有被计算,并且它内部的任何副作用操作(例如赋值或函数调用)都不会发生。请参见“表达式”一节


ptype expr

p型

打印表达式表达式类型的说明。ptype与whatis的不同之处在于打印详细的描述,而不仅仅是类型的名称。例如,对于此变量声明:

这两个命令提供此输出:

(gdb) whatis v
 type = struct complex
(gdb) ptype v
 type = struct complex {
    double real;
    double imag;
 }

gdb尊重类型的
p
?好的,这是一个好问题。gdb查看包含可执行文件(通常是ELF文件)的对象文件中的调试信息(通常是DWARF)。如果它看到指令指针是0xXXXXX,并且在函数foo中,它将查找foo中定义的变量,并看到您请求的p。它看到p是一个int,读取p中包含的地址处的内存(有时是4个字节),并将结果解释为整数。gdb完全依赖于对象文件中的调试信息。调试信息仅以某些(非常旧的)对象文件格式(如COFF)存储在符号表中。在大多数现代操作系统上,调试信息不存储在符号表中。
(gdb) whatis v
 type = struct complex
(gdb) ptype v
 type = struct complex {
    double real;
    double imag;
 }