Gab*_*les 29
ptype
、whatis
、 和explore
(我最喜欢的!):其中您有一个名为的变量value
,其定义为:
uint32_t value = 1234;
Run Code Online (Sandbox Code Playgroud)
...以下所有工作:
ptype value
节目unsigned int
whatis value
节目uint32_t
explore value
(我最喜欢的!)显示:
Run Code Online (Sandbox Code Playgroud)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
例子:
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
Run Code Online (Sandbox Code Playgroud)
感谢@o11c 下面的评论指出了该whatis
命令的存在。
我explore
通过在 gdb 中运行发现了该命令help all
。请参阅下面“参考文献”部分中我的评论。
(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
Run Code Online (Sandbox Code Playgroud)
现在,在gdb
运行时执行以下操作:
# 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
Run Code Online (Sandbox Code Playgroud)
完整示例命令和输出:
Run Code Online (Sandbox Code Playgroud)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)
ptype my_var
Run Code Online (Sandbox Code Playgroud)
返回类似 的东西type = unsigned short
,但我希望它返回type = uint16_t
,这样我在检查内存时可以真正知道它有多少字节。我能想到的要获得这种效果的最好方法是:
print &my_var
Run Code Online (Sandbox Code Playgroud)
它打印(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
Run Code Online (Sandbox Code Playgroud)
同样,通知ptype my_var
揭示了它是一个unsigned short
,而print &my_var
揭示了更详细和期望的答案,即它是一个uint16_t
。
help all
- 我在运行时使用了此命令gdb
,将输出全部复制粘贴到文本编辑器,然后搜索“type”以发现该explore
命令。printf
在 GDB 中使用以便围绕变量输出编写自定义描述的回答关键词:如何运行gdb;如何在gdb中查看变量类型和值;如何构建和编译 gdb 调试符号
t. *_*man 11
'ptype [ARG]'命令将打印该类型.
reg*_*arg 10
这个问题可能是相关的:使用gdb的C++多态类中的vtable:
(gdb) help set print object
Set printing of object's derived type based on vtable info.
Run Code Online (Sandbox Code Playgroud)
它不完全是typeid(),但它应该在检查多态指针时显示真实的对象类型(例如this
在基类中).当然只适用于具有vtable的类(即至少一个虚拟方法),但也适用typeid
.
归档时间: |
|
查看次数: |
28583 次 |
最近记录: |