调试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中这样做。
根据原始问题中的评论,建议如下:
这解决了这个问题。
在我的例子中,问题是内部托管组件中的一个例外,它显然没有很好地传播到调用它的本机层 - 并且表现为这个不可能的ETW堆栈。
要调试我必须附加为仅管理。例外是面对我(丢失DLL,但这是无关紧要的)。
希望这有助于那里的人。