我正在调试崩溃,我注意到调试器的一个步骤,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;
}
是否存在任何情况下的值this
当我们单步执行给定成员函数中的代码时,可以或应该改变吗?
Update
我必须添加记录并响应几条评论,我正在调试发布版本,但是当我在调试版本中调试相同的函数时,this
终究没有改变。
那么这意味着什么,是否只有发布版本才有问题?
@drescherjm 的评论被赞成,其中说in release mode the this pointer is not correct because of optimization
但“不正确”到底是什么意思呢?我们不能相信this发布版本中的指针(是假的)或者指针值是正确的,但发布版本由于优化而被破坏?
根据调试器的不同,看到以下值可能是正常的this
之间改变hitting函数和entering it.
hitting S::f()
entering S::f()
However, once you've entered the function, the value of this
shouldn't change1. If it does, it probably means that you have some sort of buffer overrun and are overwriting your stack.
找出问题可能很棘手。你可以尝试设置内存断点this
查看它何时更改或注释掉代码,直到问题消失。这应该可以帮助您缩小范围。请注意,罪魁祸首甚至可能不在该特定功能中:内存损坏因在不相关的地方造成严重破坏而臭名昭著。
您似乎也在使用优化的构建来看待这个问题。使用优化时要非常小心地依赖调试器:变量可能会从代码中消失,给您留下它们的值错误的印象。如果您可以重现该问题,我会尝试记录this
某处而不是通过调试器查看它。这整件事实际上可能是一个转移注意力的事情。
1However, this
can change when you're calling another member function across a hierarchy, especially when virtual bases are involved.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)