C ++ / CLI:调试/步入32位代码时的访问冲突(VS-2015)

问题描述 投票:0回答:2

调试32位混合模式程序集时,在进入代码时遇到了这个奇怪的问题。代码的精简版本如下所示:

public ref class FooClass {
    public:
        FooClass();
};

FooClass::FooClass(){
    // Note: doesn't matter what code is in here, as long as it is native
    char test[10];
    memset((void*)test, 0, sizeof(test));
}

然后在另一个类中实例化该类:

FooClass^ BarClass::Test() {
    FooClass^ addr = gcnew FooClass();
    return addr;
}

..再次在C#控制台应用程序中实例化:

class Program
{
    static void Main(string[] args)
    {
        BarClass bar = new BarClass();
        FooClass foo  = bar.Test();
    }
}

当单步执行代码并进入FooClass构造函数时,我得到一个异常

(注意:为了减少混乱,删除了参数信息):

ntdll.dll!_NtTraceEvent@16()    Unknown
ntdll.dll!EtwpEventWriteFull()  Unknown
ntdll.dll!_EtwEventWrite@20()   Unknown
clrjit.dll!Compiler::lvaInitTypeRef() Line 253  C++
clrjit.dll!Compiler::compCompileHelper(...) Line 3489   C++
clrjit.dll!Compiler::compCompile(...) Line 3092 C++
clrjit.dll!jitNativeCode(...) Line 4063 C++
clrjit.dll!CILJit::compileMethod(...) Line 180  C++
[Managed to Native Transition]  
>   FooBar.dll!FooBar::BarClass::Test() Line 16 C++
ConsoleApp.exe!ConsoleApp.Program.Main(string[] args) Line 15   C#

但是,如果我只是在构造函数中添加断点并运行到下一个断点,则代码运行正常。

此外,删除本机代码时,它运行正常。

在64位模式下不会发生此问题。我交叉检查设置,但不能真正看到任何特殊的东西。

没有第三方dll,所有本机代码都被编译到程序集中。

这不是我的第一个C ++ / CLI项目,但是我第一次在VS2015中这样做。

debugging visual-studio-2015 c++-cli access-violation
2个回答
2
投票

根据原始问题中的评论,建议如下:

  1. 输入工具 - >选项 - >调试 - >常规
  2. 启用“使用托管兼容模式”复选框

这解决了这个问题。


0
投票

在我的例子中,问题是内部托管组件中的一个例外,它显然没有很好地传播到调用它的本机层 - 并且表现为这个不可能的ETW堆栈。

要调试我必须附加为仅管理。例外是面对我(丢失DLL,但这是无关紧要的)。

希望这有助于那里的人。

© www.soinside.com 2019 - 2024. All rights reserved.