问题解决了警报。首先阅读最终更新。 ................................................. < / p>
我有通过COM调用c#库的vb6应用程序
C#库是Framework 4.5.2
如果我在运行VS2017的特定机器上构建COM库15.5.6我没有问题。
如果我在特定记录中检出相同的代码并在不同的机器上构建它(我尝试了其中2个)和vS2017 15.5.2,我的应用程序崩溃了。
错误发生在代码行
上if(edge.Extra == null)//给定边缘不为空且Extra是属性
在Windows事件日志中有
Faulting application name: jtJobTalk.exe, version: 1.0.0.0, time stamp: 0x5a9f5b1c
Faulting module name: ntdll.dll, version: 6.3.9600.18895, time stamp: 0x5a4b127e
Exception code: 0xc00000fd
Fault offset: 0x0006d46c
Faulting process ID: 0xb74
Faulting application start time: 0x01d3b5c77355520d
Faulting application path: C:\jobtalk\jtJobTalk.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report ID: d1374fd2-21ba-11e8-8272-d050999dc03c
我尝试过sfc扫描,没有报告任何问题。
在另一台计算机上(运行Windows 7)我收到错误
A new guard page for the stack cannot be created
如何进一步解决此问题?
我害怕在好机器上更新VS版本,以免导致我无法释放。
[更新]
在对MessageBox.Show进行一些调用之后,我已经确定错误是由一个从它自己的构造函数中引用自身的对象引起的。
我至少花了一天时间才发现这一点。我正在寻找可以帮助我更容易地诊断问题的任何智慧珍珠。
答案 0 :(得分:2)
异常代码:0xc00000fd
那是STATUS_STACK_OVERFLOW。一个非常常见的事故,很难调试,以至于他们之后命名了一个受欢迎的程序员网站。您在调试器的帮助下获得了此次事故的原始版本。始终是互操作代码中的问题,您不能依赖托管调试器引擎来帮助您进行诊断。谷歌是你最好的选择,这个短语的所有热门歌曲都可以帮助你走上正确的道路,开始修复它。
如果我在特定机器上构建COM库......
那是不吉利的,翻过错误的石头寻找原因会让你陷入困境一段时间。 SOE绝不是由构建问题或错误的VS版本引起的,总是编码错误。它会在一台机器上发生而不是另一台机器上的最基本原因是您不使用完全相同的数据测试程序。或者做了一个看起来非常无辜的快速编码更改,但事实并非如此。
if(edge.Extra == null)
这是SOE的一个非常常见的原因,这是一个有缺陷的财产吸气剂。像这样:
public class Example {
private Foo edge;
public Foo Edge {
get { return Edge; } // Oops, meant edge
}
}
你肯定可以暂时看一下,但从未看过它。如果编译器有一个诊断它会很好,但C#编译器没有必要的管道来解决这个问题。另一个非常常见的原因是字段初始化程序:
public class Example {
private Example foo = new Example();
// etc...
}
例如,当您创建另一个类的实例,并且该类在其构造函数中创建一个Example对象时,可以轻松地从那里进行更复杂的处理。而C#语言支持编写递归代码,它是标准编程技术之一。如果该代码比O(log(n))更复杂,那么您总是可以使用太多数据轻松崩溃。
......任何智慧的珍珠
是的,有一个。如果您没有托管调试引擎来帮助解决异常问题,那么诊断错误就很难了。 VB6运行时可以为您提供异常消息,但不提供Holy Stack Trace。在两个截然不同的运行时环境之间的转换中丢失的信息。
但是你可以拥有那块蛋糕并且也可以吃它,诀窍是让托管调试器启动VB6 IDE。右键单击您的C#类库项目&gt;属性&gt;调试选项卡。选择“启动外部程序”单选按钮,然后键入“C:\ Program Files(x86)\ Microsoft Visual Studio \ VB6 \ VB6.exe”。您可以选择将“命令行参数”设置为.vbp项目的完整路径,这样IDE就会自动加载您的VB6项目。使用Debug&gt; Windows&gt;例外设置并选中“公共语言运行时例外”复选框,以便显示刻度线。这使调试器在传递给VB6代码之前停止在任何C#异常上。
按F5键,VB6 IDE开始运行。再次按F5启动VB6代码。现在,C#代码中的任何不幸事件都会导致托管调试器进入。通常显示器会自动切换到VS IDE,但有时您必须单击闪烁的任务栏按钮。您可以查看引发异常的代码并使用Debug&gt; Windows&gt; Stack Trace以了解它是如何到达那里的。
我不是100%确定这也可用于诊断SOE,VB6运行时可能会过早介入以允许CLR查看异常。我没有安装VB6来检查。请尝试一下,让我知道。