[英]What are the pitfalls of debugging optimized code?
这个问题是一个跟进这一个地方的共识是, the value of *this* pointer is not correct because of optimization
但到底是什么not correct
的手段?
我们如何调试优化的代码? 我们用WinDbg花了很多时间来窥探指针,对象布局,堆栈指针甚至指令指针..这是否意味着我们不能依赖这些值,因为它是优化的代码? 我们可以依靠什么而不是什么?
IIRC,在VC ++中, this
作为寄存器ECX
传递给函数,因此调试器仅假定ECX
是 this
, ECX
被抛弃。 也就是说this
是一样的(CADOCommand*)ECX
。
在调试版本中,这很好,因为不重用寄存器,但是在发行版本中, ECX
与其他任何寄存器一样被重用。 因此,调试器无法跟踪实际的this
或它所指向的任何内容。 该代码仍然是正确的,当然,仅调试器会受到影响。
实际上,每次调用其他类的成员函数时,必须重写ECX
。 例如:
m_pCommand.CreateInstance(__uuidof(Command));
将被编译为以下内容:
PUSH ECX ; push this into the stack
MOV ECX, &m_pCommand
PUSH __uuidof(command) ; a constant maybe?
CALL CCommand::CreateInstance
POP ECX ; restore this
注意如何,如果编译器确定当前this
不再需要,则可以省略PUSH/POP ECX
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.