zar*_*zar 5 c++ debugging windbg
我正在调试崩溃,我注意到作为调试器的一步,this指针改变其值,经过3个步骤后,它最终得到值0x00000001并且应用程序崩溃.
现在0x00000001值显然是错误的,但是this当我逐步调试调试器时,我真的期望值会改变吗?
下面是我正在调试崩溃的构造函数.我已经this在每个步骤的注释中包含了指针的值,你可以看到它跳了很多.
CADOCommand::CADOCommand(CADODatabase* pAdoDatabase, CString strCommandText, int nCommandType)
{
m_pCommand = NULL;
m_pCommand.CreateInstance(__uuidof(Command)); // this = 0x515f9d10
m_strCommandText = strCommandText; // this = 0x2c0c0ee8
m_pCommand->CommandText = m_strCommandText.AllocSysString(); // this = 0x515f9d20
m_nCommandType = nCommandType; // this = 0x70847a55
m_pCommand->CommandType = (CommandTypeEnum)m_nCommandType; // this = 0x00000001
m_pCommand->ActiveConnection = pAdoDatabase->GetActiveConnection();
m_nRecordsAffected = 0;
}
Run Code Online (Sandbox Code Playgroud)
在this我们单步执行给定成员函数中的代码时,是否存在可能或应该更改的值?
更新
我必须添加记录并回应几条评论,我正在调试发布版本,但是当我在调试版本中调试相同的函数时,其值this并没有改变.
那么这意味着什么,仅在发布版本中存在问题吗?
@drescherjm的评论是赞成的,in release mode the this pointer is not correct because of optimization但这说明"不正确"究竟是什么意思呢?我们不能相信发布版本中的这个指针(是假的)或指针值是否正确但是由于优化而导致发布版本被破坏?
根据调试器,也可能是正常的,看到的值this之间的变化打功能,进入它.
打 S::f()
进入 S::f()
但是,一旦进入该功能,其值this不应更改1.如果是这样,可能意味着你有某种缓冲区溢出并覆盖你的堆栈.
找出问题可能很棘手.您可以尝试打开内存断点,this以查看它何时更改或注释掉代码,直到问题消失.这应该可以帮助你缩小范围.请注意,罪魁祸首可能甚至不在那个特定的功能中:内存损坏因在不相关的地方造成破坏而臭名昭着.
您似乎也在使用优化的构建来查看此内容.在使用优化时要非常谨慎地依赖调试器:变量可能会从代码中消失,从而让人觉得它们的值是错误的.如果你可以重现这个问题,我会尝试在this某个地方登录而不是通过调试器查看它.整件事实际上可能是红鲱鱼.
1但是,当您在层次结构中调用另一个成员函数时,this 可能会发生更改,尤其是涉及虚拟基础时.
| 归档时间: |
|
| 查看次数: |
687 次 |
| 最近记录: |