2013-06-05 40 views
6

Thông thường, các giá trị enum là các giá trị gia tăng trình biên dịch đơn giản hoặc được đặt trực tiếp thành chữ không thể tách rời và do đó các giá trị có thể được suy ra dễ dàng hoặc được xem trực tiếp bằng cách xem tệp nguồn.Trong Windbg, làm thế nào tôi có thể liệt kê các giá trị của một kiểu liệt kê trong khi gỡ lỗi?

Tuy nhiên, đôi khi giá trị enum được sử dụng để đặt hằng số trong lớp bằng giá trị được xác định ở nơi khác hoặc kết quả của biểu thức biên dịch không dễ bị trùng lặp.

Có cách nào để Windbg hiển thị cho tôi giá trị thực tế của mỗi thành viên enum cho những trường hợp phức tạp hơn không?

Trả lời

9

xem xét cấu trúc nhỏ này:

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, 
    }; 
}; 

Cách nhanh nhất là sử dụng lệnh dt, sử dụng công tắc -r (recurse, mà bạn cần phải liệt kê các enum thành viên) và -v (verbose, mà bạn cần phải liệt kê enum s ở tất cả):

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 

Bạn có thể thấy rằng nó liệt kê các giá trị của từng enum, thậm chí cả tên chưa được đặt tên. Nhiều enums chưa được đặt tên sẽ được liệt kê chính xác.

Vấn đề với dt -r -v foo là nó liệt kê tất cả các thành viên duy nhất của foo: tất cả các thành viên dữ liệu, tất cả các thành viên chức năng, tất cả enums, nó cố gắng recurse vào mỗi người và danh sách thành viên. Nếu foo là một lớp phức tạp, mà là khá dễ dàng để có được với thừa kế, đầu ra sẽ rất lớn, và nó sẽ rất khó để tìm thấy một enum bạn đang tìm kiếm.

Vì vậy, lựa chọn tiếp theo là nói dt mà enum mà bạn muốn, cụ thể là:

0:000> dt foo::enum1 
LangTestingD!foo::enum1 
    enum1_val1_ = 0n5 
    enum1_val2_ = 0n6 

Được rồi, tuyệt vời! Nhưng làm thế nào về enumed enum? Vâng, bạn nói, kiểm tra đầu ra ở trên, nơi nó sử dụng <unnamed-tag>. Có lẽ chúng ta có thể sử dụng nó.

0:000> dt foo::<unnamed-tag> 
Couldn't resolve error at 'foo::<unnamed-tag>' 

Nó thực sự sẽ hoạt động nhưng bạn cần sử dụng thêm một vài công tắc. Khi bạn kết hợp -n (tham số sau đây là một cái tên) và -y (phù hợp với thông số tiếp theo như một tiền tố tên) sau đó nó, loại, hoạt động:

0:000> dt -n -y foo::<unnamed-tag> 
LangTestingD!foo::<unnamed-tag> 
    some_class_constant_ = 0n86 

Tuy nhiên, chỉ có giá trị đầu tiên được liệt kê. Thậm chí tệ hơn, nếu có nhiều enumsed unums, chỉ có giá trị đầu tiên của cái đầu tiên được liệt kê. Thường thì điều này sẽ là đủ, vì nhiều enums chưa được đặt tên không phải là quá phổ biến, nhưng nếu bạn hoàn toàn cần chúng, bạn sẽ phải sử dụng -r -v và chỉ tìm thấy chúng trong đầu ra.

Các vấn đề liên quan