基本上,我想得到
typeid(*this).name()
,即this
的真实类型。
我想在GDB中得到这个(不修改源代码)。我尝试了
print typeid(*this)
但它说 typeid
未知(因为我没有将其包含在源文件中)。
使用
ptype
命令,如下所示:
(gdb) ptype 42
type = int
ptype
、whatis
和 explore
(我最喜欢!):其中有一个名为
value
的变量,其定义为:
uint32_t value = 1234;
...以下所有工作:
ptype value
显示 unsigned int
whatis value
显示 uint32_t
explore value
(我的最爱!)显示:
The value of 'value' is of type 'uint32_t' which is a typedef of type 'unsigned int' 'value' is a scalar value of type 'unsigned int'. value = 1234
示例:
(gdb) ptype value
type = unsigned int
(gdb) ptype &value
type = unsigned int *
(gdb) whatis value
type = uint32_t
(gdb) explore value
The value of 'value' is of type 'uint32_t' which is a typedef of type 'unsigned int'
'value' is a scalar value of type 'unsigned int'.
value = 1234
感谢下面@o11c的评论指出了
whatis
命令的存在。
我通过在 gdb 中运行
explore
发现了 help all
命令。请参阅下面“参考文献”部分中我的评论。
# download the file "type_punning.c"
wget https://raw.githubusercontent.com/Generalsimus/eRCaGuy_hello_world/master/c/type_punning.c
# build it with optimization OFF (`-O0`) and debugging symbols ON (`-ggdb`),
# and output all intermediary files (`-save-temps=obj`), and run it in the
# gdb debugger (`gdb bin/type_punning`)
mkdir -p bin && gcc -Wall -Wextra -Werror -O0 -ggdb -std=c11 -save-temps=obj \
type_punning.c -o bin/type_punning && gdb bin/type_punning
现在,运行
gdb
,执行以下操作:
# set breakpoint to a line just after `u.value = 1234;`
b type_punning.c:52
# run to that point
r
# Now run these various commands to see what type `u.value` is:
ptype u.value
whatis u.value
explore u.value
完整示例命令和输出:
eRCaGuy_hello_world/c$ mkdir -p bin && gcc -Wall -Wextra -Werror -O0 -ggdb -std=c11 -save-temps=obj type_punning.c -o bin/type_punning && gdb bin/type_punning GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from bin/type_punning...done. (gdb) b type_punning.c:52 Breakpoint 1 at 0x70b: file type_punning.c, line 52. (gdb) r Starting program: /home/gabriel/GS/dev/eRCaGuy_hello_world/c/bin/type_punning Type punning and ptr-based serialization demo TECHNIQUE 1: union-based type punning: Breakpoint 1, main () at type_punning.c:53 53 printf("1st byte = 0x%02X\n", (u.bytes)[0]); (gdb) ptype u.value type = unsigned int (gdb) whatis u.value type = uint32_t (gdb) explore u.value The value of 'u.value' is of type 'uint32_t' which is a typedef of type 'unsigned int' 'u.value' is a scalar value of type 'unsigned int'. u.value = 1234 (gdb)
正如@Star Brilliant 所说,这个:
ptype my_var
返回像
type = unsigned short
这样的东西,但我希望它返回type = uint16_t
,这样我在检查内存时可以真正知道它有多少字节。我能想到的最好的方法就是:
print &my_var
打印
(uint16_t *) 0x7ffffffefc2c
,从而揭示其指针类型是 uint16_t*
,这意味着它的类型是 uint16_t
。
我发现这比
ptype my_var
更有用,但是如果您有任何建议,需要一种更直接的方法来获得这种效果。
gdb 命令和输出示例:
(gdb) ptype my_var
type = unsigned short
(gdb) print &my_var
$27 = (uint16_t *) 0x7ffffffefc2c
再次注意,
ptype my_var
揭示了它是一个unsigned short
,而print &my_var
揭示了更详细和期望的答案,即它是一个uint16_t
。
help all
- 我在运行 gdb
时使用了此命令,将输出全部复制粘贴到文本编辑器,然后搜索“type”以发现 explore
命令。关键词:如何运行gdb;如何在gdb中查看变量类型和值;如何构建和编译 gdb 调试符号
ptype [ARG]
命令将打印类型。
这个问题可能相关:vtable in polymorphic class of C++ using gdb:
(gdb) help set print object
Set printing of object's derived type based on vtable info.
它不完全是 typeid() 但它应该在检查多态指针时显示真实的对象类型(例如基类中的
this
)。当然,仅适用于具有 vtable 的类(即至少一个虚拟方法),但 typeid
也是如此。