繁体   English   中英

为什么在调试托管C ++而不进行优化时,VS2005为什么跳过行执行?

[英]Why does VS2005 skip execution of lines when debugging managed C++ without optimizations?

我遇到了一个相当奇怪的行为,我什至不知道该如何开始描述。 我编写了一段托管C ++代码,这些代码调用了本机方法。

一个(非常)简化的代码版本看起来像这样(我知道它看起来像一个完整的本机函数,只要假设到处都有托管的东西):

int somefunction(ptrHolder x)
{
  // the accessptr method returns a native pointer
  if (x.accessptr() != nullptr) // I tried this with nullptr, NULL, 0)
  {
    try
    {
      x->doSomeNativeVeryImportantStuff(); // or whatever, doesn't matter
    }
    catch (SomeCustomExceptionClass &)
    {
      return 0;
    }
  }

  SomeOtherNativeClass::doStaticMagic();

  return 1;
}

我使用/ clr标志(VS.NET 2005,SP2)在没有优化的情况下编译了此代码,并在调试器中运行它时获得了if语句,因为指针实际上为空,所以我没有输入if,但是令人惊讶的是,光标直接跳到return 1语句,完全忽略了doStaticMagic()方法!

查看汇编代码时,我发现它确实直接跳到了该行。 如果我强制调试器进入if块,那么在按F10键之后,我还会跳到return 1语句。

任何想法为什么会这样?

谢谢,阿里尔

您是否尝试过检查是否确实为SomeOtherNativeClass :: doStaticMagic();发出了代码? 线? 也许编译器找不到它(或找到一个空函数或类似的东西),因此跳过了它。

第二个想法:也许您正在比较使用nullptr无法比较的两件事。 因此,您将获得一个异常,该异常将被捕获并导致您直接退出该方法。

难道是VS2005中的Just My Code功能? 默认情况下启用。

来自MSDN:

有时,在调试时,您可能只想查看已编写的代码,而忽略其他代码,例如系统调用。 您可以使用Just My Code调试来做到这一点。 “仅我的代码”隐藏了非用户代码,因此它不会出现在调试器窗口中。 在执行步骤时,调试器将逐步执行所有非用户代码,但不会在其中停止。

为了区分用户代码(“我的代码”)和非用户代码,“我的代码”着眼于三件事:DBG文件,PDB文件和优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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