在Windbg中,如何在调试时列出枚举的值
In Windbg, how can I list the values of an enumeration while debugging?
通常,enum
值是简单的编译器增量值,或者直接设置为整型文字,因此可以很容易地推导出这些值,或者通过查看源文件直接看到这些值。
然而,有时enum
值用于将类内常量设置为其他地方定义的值或不易复制的编译时表达式的结果。
是否有办法让Windbg向我展示每个enum
成员的实际值对于那些棘手的情况?
考虑这个小结构体:
struct foo
{
enum enum1
{
enum1_val1_ = 5,
enum1_val2_,
};
enum enum2
{
enum2_val1_ = 0x0001,
enum2_val2_ = 0x0010,
};
enum
{
// assume these come from complicated compile-time expressions
some_class_constant_ = 86,
another_one_ = 99,
};
};
最快的方法是使用dt
命令,使用开关-r
(递归,您需要列出enum
成员)和-v
(详细,您需要列出enum
):
0:000> dt -r -v foo
LangTestingD!foo
struct foo, 3 elements, 0x1 bytes
Enum enum1, 2 total enums
enum1_val1_ = 0n5
enum1_val2_ = 0n6
Enum enum2, 2 total enums
enum2_val1_ = 0n1
enum2_val2_ = 0n16
Enum <unnamed-tag>, 2 total enums
some_class_constant_ = 0n86
another_one_ = 0n99
可以看到它列出了每个枚举的值,包括未命名的枚举。多个未命名的枚举将被正确列出。
dt -r -v foo
的问题是它列出了foo
的每一个成员:所有的数据成员,所有的函数成员,所有的枚举,和它试图递归到每一个并列出它的成员。如果foo
是一个复杂的类,通过继承很容易获得,那么输出将是巨大的,并且很难找到您正在寻找的枚举。
所以下一个选项是告诉dt
你想要哪个enum,特别是:
0:000> dt foo::enum1
LangTestingD!foo::enum1
enum1_val1_ = 0n5
enum1_val2_ = 0n6
好的,太棒了!但是那个未命名的枚举呢?好吧,您会说,看看上面的输出,其中使用了<unnamed-tag>
。也许我们可以用它。
0:000> dt foo::<unnamed-tag>
Couldn't resolve error at 'foo::<unnamed-tag>'
它实际上会工作,但你需要使用几个额外的开关。当您将-n
(下面的参数是一个名称)和-y
(将下一个参数匹配为名称前缀)组合在一起时,它可以工作:
0:000> dt -n -y foo::<unnamed-tag>
LangTestingD!foo::<unnamed-tag>
some_class_constant_ = 0n86
但是,只列出第一个值。更糟糕的是,如果有多个未命名的枚举,则只列出第一个枚举的第一个值。通常这就足够了,因为多个未命名的枚举并不常见,但如果您绝对需要它们,则必须使用-r -v
并在输出中找到它们。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- C++两个源文件之间共享的枚举的静态实例
- 打印没有铸件的枚举可以在C++中吗?
- 枚举成员与静态 int 成员?
- C++:枚举:错误:应使用标识符而不是"}"
- 宏使枚举调试器感知?
- C++ Visual Studio 调试器枚举错误
- 在Windbg中,如何在调试时列出枚举的值
- 为属性表创建调试友好的枚举