2010-04-28 106 views
0

我遇到了一个相当奇怪的行为,我甚至不知道如何开始描述。 我写了一段托管C++代码,可以调用本地方法。为什么在不进行优化的情况下调试托管C++时,VS2005会跳过执行行?

A(非常)简化了代码看起来像这样的版本(我知道它看起来像一个完整的原生功能,只承担有管理的东西被全部完成过的地方):

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后跳到返回1语句。

任何想法为什么会发生这种情况?

感谢, 林依晨

回答

1

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

第二个想法:或许你正在比较两个无法通过使用nullptr进行比较的东西。所以你会得到一个异常,它会被捕获并导致你直接退出该方法。

+0

你说得对。托管C++在引发异常并且未处理异常时执行异常行为,执行跳转到最后一个返回行,在调试器中看起来令人困惑。 – Sakin 2010-05-11 12:23:53

1

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

从MSDN:

有时候,当你正在调试, 你可能想看看只有你所编写的代码 而忽略其他 代码,比如系统调用。你可以用Just My Code调试来做 。只需 我的代码隐藏非用户代码,以使其 未出现在调试器 窗口中。当你步,调试器 逐步通过任何非用户代码,但 不停止在它。

为了区分用户代码非用户代码(“我的代码”) ,仅我的代码看起来 在三件事情:DBG文件,PDB文件, 和优化。

相关问题