奇怪的调试问题?

时间:2010-07-14 15:37:14

标签: c++ visual-studio debugging

我创建了这个数据结构:

class Event
{
public:
    Event(EVENT_TYPE type, void* pSender = 0, int content1 = 0,  
        int content2 = 0, int content3 = 0, int content4 = 0);
    ~Event(void);

// ... some functions

protected:
    EVENT_TYPE itsType;
    void* itsPointerToSender;
    int itsContent_1;
    int itsContent_2;
    int itsContent_3;
    int itsContent_4;
    int numStacked;
};

其构造函数只是

Event::Event(EVENT_TYPE type, void* pSender, int content1, int content2, int content3, int content4)
    :   itsType(type),
    itsPointerToSender(pSender),
    itsContent_1(content1),
    itsContent_2(content2),
    itsContent_3(content3),
    itsContent_4(content4),
    numStacked(0)
{
}

由于一些我无法理解的奇怪原因,VS调试器不能也不会向我显示itsContent_4中包含的内容。如果我对变量进行监视,itsContent_4给了我一个symbol "itsContent_4" not found,同时itsContent_3做同样的事情就完美了。就编译器而言,我不确定该变量是否存在!

我在这里错过了什么吗?

编辑:现在看来(甚至更奇怪)改变声明中变量的顺序会造成更大的混乱!我尝试在itsContent_4之前放置itsContent_1,现在使用itsContent_1的值初始化itsContent_4!这里发生了什么?我怀疑与命名有关,所以我会尝试重命名它们,看看会发生什么。

编辑2:是的,显然将变量名称更改为itsContent_a而非itsContent_1等等,效果非常好。在变量名中使用数字有一些限制吗?

2 个答案:

答案 0 :(得分:3)

听起来像调试器使用了错误的.pdb文件。工具+选项,调试,常规,确保选中“要求源文件与原始版本完全匹配”。

在使用断点进行调试时,使用Debug + Windows + Modules并右键单击列表中的可执行文件。单击“符号加载信息”以查找调试器找到.pdb文件的位置。

另一个可能的不幸是这个类是在一个单独编译的可执行文件中定义的,就像DLL一样,它是用不兼容的设置编译的。这样对象的布局就不再匹配了。在这种情况下,这不太可能。

答案 1 :(得分:1)

检查您是否尝试调试发布版本。在发布版本中,优化器可以删除未使用的variabled并更改执行语句的顺序。调试时可能会造成混淆。