[英]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.