【问题标题】:troubleshooting error code 1000 application crash故障排除错误代码 1000 应用程序崩溃
【发布时间】:2018-08-14 20:09:43
【问题描述】:

问题已解决警报。首先阅读最终更新。 ..................................................

我有一个通过 COM 调用 c# 库的 vb6 应用程序

C# 库是 Framework 4.5.2

如果我在运行 VS2017 15.5.6 的特定机器上构建 COM 库,我没有问题。

如果我在特定记录中使用 vS2017 15.5.2 签出相同的代码并在另一台机器上构建它(我尝试了其中 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 进行了一些调用后,我确定该错误是由从其自己的构造函数中引用自身的对象引起的。

我至少花了一天时间才发现这一点。我正在寻找任何可以帮助我以更简单的方式诊断问题的智慧。

【问题讨论】:

标签: c# com vb6


【解决方案1】:

异常代码:0xc00000fd

即 STATUS_STACK_OVERFLOW。一个非常常见的事故,并且难以调试,以至于他们以它命名了一个流行的程序员网站。在调试器几乎没有帮助的情况下,您将获得此事故的原始版本。互操作代码中始终存在问题,您不能依赖托管调试器引擎来帮助您诊断它。 Google 是您的最佳选择,该短语的所有热门搜索都可帮助您走上正确的道路来开始修复它。

如果我在特定机器上构建 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 运行时可以为您提供异常消息,但不能提供神圣堆栈跟踪。在两个非常不同的运行时环境之间转换时丢失的信息。

但是你也可以吃蛋糕,诀窍是让托管调试器启动 VB6 IDE。右键单击 C# 类库项目 > 属性 > 调试选项卡。选择“启动外部程序”单选按钮并键入“C:\Program Files (x86)\Microsoft Visual Studio\VB6\VB6.exe”。您可以选择将“命令行参数”设置为 .vbp 项目的完整路径,这样 IDE 会自动加载您的 VB6 项目。使用 Debug > Windows > Exception Settings 并勾选“Common Language Runtime Exceptions”复选框,以便显示勾选标记。这会使调试器在任何 C# 异常上停止,然后再将其传递给您的 VB6 代码。

按 F5,VB6 IDE 开始运行。再次按 F5 启动您的 VB6 代码。现在,C# 代码中的任何意外都会导致托管调试器介入。通常显示会自动切换到 VS IDE,但有时您必须单击闪烁的任务栏按钮。您可以查看引发异常的代码并使用 Debug > Windows > Stack Trace 找出它是如何到达那里的。

我不能 100% 确定这也适用于诊断 SOE,VB6 运行时可能会过早介入以使 CLR 看到异常。我没有安装 VB6 来检查。请尝试并告诉我。

【讨论】:

  • 谢谢你,关于珍珠的事情我会回复你的:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多