繁体   English   中英

调试优化代码有哪些陷阱?

[英]What are the pitfalls of debugging optimized code?

这个问题是一个跟进一个地方的共识是, the value of *this* pointer is not correct because of optimization但到底是什么not correct的手段?

  1. 我们不能信任指针的值,因此在调试发行版时应该将其全部丢弃吗?
  2. 在我们调试发行版时, 指针可能会更改其值,这没关系,因为其优化的代码可能并不意味着任何危害?
  3. 指针仍然指向对象的有效内存块,并且即使更改了其优化代码,也要引起关注。
  4. 实际代码和优化的生成代码之间不匹配,这就是为什么调试器可能显示错误的值或变量的值可能突然改变的原因? 我可以理解调试器显示的值是否不正确,但是为什么这些值应该更改?

我们如何调试优化的代码? 我们用WinDbg花了很多时间来窥探指针,对象布局,堆栈指针甚至指令指针..这是否意味着我们不能依赖这些值,因为它是优化的代码? 我们可以依靠什么而不是什么?

IIRC,在VC ++中, this作为寄存器ECX传递给函数,因此调试器仅假定ECX thisECX 抛弃。 也就是说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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM