为什么VS2005在没有优化的情况下调试托管C ++时会跳过执行行?

时间:2010-04-28 10:20:36

标签: .net visual-studio-2005 c++-cli

我遇到了一种奇怪的行为,我甚至不知道如何开始描述。 我写了一段托管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语句,因为指针实际上是null,我不输入if但令人惊讶的是,光标直接跳转到return 1语句,完全忽略了doStaticMagic()方法!

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

为什么会发生这种情况?

谢谢, 爱丽儿

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

可能是VS2005中的Just My Code功能吗?它默认启用。

来自MSDN:

  

有时,在调试时,   你可能只想看看   您编写的代码并忽略其他代码   代码,例如系统调用。你可以做   这与Just My Code调试。只是   我的代码隐藏了非用户代码   没有出现在调试器中   视窗。当你步进,调试器   通过任何非用户代码,但步骤   并不止于此。

     

区分用户代码(“我的代码”)   从非用户代码,Just My Code看起来   有三件事:DBG文件,PDB文件,   和优化。