Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2358662
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2008-03-30 17:35:43

在看雪学院的 <<逆向C++>>一文中偶尔看到说VC6.0 以上的编译器支持一个d1reportAllClassLayout的开关, 可以输出所有对象的内存布局信息, 心想我不知道多少次查看过 cl /?的输出, 没印象这个玩艺儿呀, 打开cmd窗口, 弄了个例子程序, 一试不爽.
小例子程序如下:

struct Foo
{
        int i;
        char c;
};
int main()
{
        Foo f;
        f.i = 5;
        return 0;
}

这个开关输出了包括Foo结构在内, 主要是一大堆编译器内部的结构的内存布局, 其实还有一个开关是
d1reportSingleClassLayout
用起来是这样:
cl -d1reportSingleClassLayoutFoo test.cpp
切切注意, Layout跟指定的结构/类名Foo之间没有空格, 有空格就不对了. 这会只输出指定的结构的内存布局.

遗憾的是, 不能多次指定 -d1reportSingleClassLayout以输出多个自定义的结构的内存布局. 而且也不支持通配符*之类.

在google里搜了一下, msvc hidden switch, 本想顺藤摸瓜找出MSVC支持的所有隐藏开关, 没发现什么其它的.

在VS测试小组
Andy Rich的blog中, 说这样的选项未经公布, 也没做测试, 使用者责任自负. 呵呵, 这是当然. 不论如何, 有这个总比没有好.

下面看看对包含了虚函数的类的输出:




class Foo
{
    public:
    int i;
    virtual void foo();
    char c;
};

void Foo::foo()
{
}
int main()
{
    Foo f;
    f.i = 5;
    return 0;
}

输出是:

不光给出了对象布局开关处的vfptr指针, 而且连带的输出了Foo对象的vtable. 最后的那个this adjustor是什么? 估计是多重继承时如何调整this指针的一个偏移量. 放在这, 估计日后用得着.
阅读(2812) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~