gdb:显示某些数据的类型信息

问题描述 投票:0回答:4

基本上,我想得到

typeid(*this).name()
,即
this
的真实类型。

我想在GDB中得到这个(不修改源代码)。我尝试了

print typeid(*this)
但它说
typeid
未知(因为我没有将其包含在源文件中)。

c++ gdb typeid typeinfo
4个回答
80
投票

使用

ptype
命令,如下所示:

(gdb) ptype 42
type = int

21
投票

使用
ptype
whatis
explore
(我最喜欢!):

其中有一个名为

value
的变量,其定义为:

uint32_t value = 1234;

...以下所有工作:

  1. ptype value
    显示
    unsigned int
  2. whatis value
    显示
    uint32_t
  3. 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

参考资料:

  1. @o11c 下面的评论
  2. @星耀的回答
  3. help all
    - 我在运行
    gdb
    时使用了此命令,将输出全部复制粘贴到文本编辑器,然后搜索“type”以发现
    explore
    命令。

另请参阅:

  1. 我对如何在GDB中像数组一样查看指针?
  2. 的回答
  3. [我的回答] “gdb”调试器奇怪地跳过断点
  4. [我的问答] 编译器的`-O0`选项和`-Og`选项有什么区别?
  5. [我的问答] https://askubuntu.com/questions/1349047/where-do-i-find-core-dump-files-and-how-do-i-view-and-analyze-the-backtrace-圣

关键词:如何运行gdb;如何在gdb中查看变量类型和值;如何构建和编译 gdb 调试符号


18
投票

ptype [ARG]
命令将打印类型。


13
投票

这个问题可能相关: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
也是如此。

© www.soinside.com 2019 - 2024. All rights reserved.