我遇到了一种奇怪的行为,我甚至不知道如何开始描述。 我写了一段托管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语句。
为什么会发生这种情况?
谢谢, 爱丽儿
答案 0 :(得分:1)
您是否尝试检查实际为SomeOtherNativeClass :: doStaticMagic()发出的代码;线?也许编译器找不到它(或找到一个空函数或类似的东西),因此跳过它。
第二个想法:也许你正在比较使用nullptr无法比较的两件事。因此,您将获得一个异常,该异常会被捕获并导致您直接退出该方法。
答案 1 :(得分:1)
可能是VS2005中的Just My Code功能吗?它默认启用。
来自MSDN:
有时,在调试时, 你可能只想看看 您编写的代码并忽略其他代码 代码,例如系统调用。你可以做 这与Just My Code调试。只是 我的代码隐藏了非用户代码 没有出现在调试器中 视窗。当你步进,调试器 通过任何非用户代码,但步骤 并不止于此。
区分用户代码(“我的代码”) 从非用户代码,Just My Code看起来 有三件事:DBG文件,PDB文件, 和优化。