2010-09-15 51 views
2

在Visual Studio中的调用堆栈窗口,它报告:什么是所谓的“框架”在视觉工作室?

[Frames below may be incorrect and/or missing, no symbols loaded for IPCamera.ax] 

是什么意思框架,为什么缺少符号可能会导致其不正确AFAIK,符号只是为了调试信息,没有的符号?只会使源看不见。

alt text

+0

这http://stackoverflow.com/questions/3717988/why-does-the-debugger-need-symbols-to-reconstruct-the-stack/3718134#3718134可能帮助为什么。 – 2010-09-15 14:58:38

回答

5

帧==堆栈帧。

堆栈帧是存储调用堆栈上每个函数调用信息的记录。它包含所调用函数的所有参数,局部变量和潜在返回值。

对于当前正在运行(即还没有退出)的每个函数调用,调用堆栈上都有一个额外的帧。

缺少符号确实可导致堆栈帧的不正确显示,这主要是由于两种现象:

  • 函数内联,和
  • 尾部调用优化。

在这两种情况下,实际代码中的函数调用都被转换成其他的东西,所以堆栈帧丢失(因为没有调用产生,因此没有堆栈帧)。

+0

为什么缺少符号可能会导致错误?编辑后仍然没有意义。 – COMer 2010-09-15 12:46:24

+0

有没有办法知道在两个断点之间执行了多少行程序集? – COMer 2010-09-15 12:56:41

+0

Konrad解释说,源代码中存在的函数之间的概念边界在优化和内联过程中可能会模糊。即使是无内联,编译器可能会生成可执行代码,从多个不同的源代码函数跳转到一个位置,因此并不总是可以说“执行停在这个地址,所以在函数X中”。调用栈通常也会显示函数参数,但是需要解释:是通过bool,int,text,指针(指向什么?)的值?在没有符号信息的函数内部,你无法辨别。 – 2010-09-15 13:26:02