我有一个问题,我一直在试图解决一段时间,但无济于事。我会看看我能否解释得足够好。
我有一个用C#编写的Windows窗体应用程序。我正在使用最新版本的VS2019。该程序旨在读取一些(很大)二进制文件,使用文件中的信息填充本地数据库,并提供用于查看结果的用户界面。
[当我调试时,我的功能之一导致代码停止前进。没有例外,没有警告,什么都没有。 VS仍然可以响应(即,我可以在诊断工具中单击并单击“停止调试”按钮)。但是,表单应用程序本身没有响应。但是,诊断工具显示该程序只是在恒定的内存使用率和0%的CPU负载下前进,好像什么也没发生。如果我尝试在调试时(在停止进度之后)在代码中添加断点,则VS将崩溃。
我在整个代码中放置了调试输出,希望查明可能是罪魁祸首的特定对象,但毫无用处。调试输出显示代码在嵌套的for循环内的随机点处停止进程。它是完全随机的...有时会停在“组4,元素1440”上,有时会停在“组7,元素2”上。我已经设置了计时器和其他断点,以尝试捕获任何幻像无限循环,但是没有一个被触发(也不应该被触发)。我使用的测试数据不会更改,因此每个对象的值在每次运行时都应相同。
我的内存没有任何问题(程序正在使用150mb,我有16GB)。运行时,处理器负载很少会超过20%。我根本不知道如何使用VS进行调试,以提供绝对为零的信息。我告诉VS打破所有异常,但是我什么也没得到。我尝试了各种不同的调试选项,以查看它们是否会提供更多信息,但它们没有给出更多信息。我试过在x64和x86上运行,结果相同。我已经清理,重建等。
请注意,我在这里不做任何线程处理。我正在使用本机代码,但是所有这些调用都在完全不同的函数中发生,并且它们没有任何问题。我打开和关闭与本地Access数据库的连接,并在数据库打开时对其进行读/写操作。
这是代码陷入瘫痪的嵌套循环:
for (int j = 0; j < feg.ElementsInGroup.Count; j++)
{
int currentPos = 0;
FrameElement fElem = feg.ElementsInGroup[j];
fElem.ElementResults = new List<ResultData>();
if (feg.GroupNumber == 4)
{
Debug.WriteLine($"Frame element #{fElem.ElementNumber} in Element Group {feg.GroupNumber} building its data");
}
for (int k = 0; k < fElem.CompoundComponent.BasicComponentResults.Count; k++)
{
FrameBasicComponentResult compResults = fElem.CompoundComponent.BasicComponentResults[k];
for (int l = 0; l < compResults.NumFrameSubSections; l++)
{
for (int m = 0; m < compResults.ResultsIncluded.Count; m++)
{
FrameBasicComponentResultValue val = compResults.ResultsIncluded[m];
try
{
if (val.UseMXPFL == true)
{
for (int p = 0; p < MXPFL; p++)
{
ResultData data = new ResultData(val.VariableType);
data.StartPosition = currentPos;
data.Label = val.Description + "-" + Convert.ToString(l + 1) + ":" + Convert.ToString(p + 1);
data.DCRatio = val.DCRatio;
fElem.ElementResults.Add(data);
if (val.VariableType.Equals(VariableType.Real) == true)
{
currentPos += 4;
}
else
{
currentPos += 2;
}
}
}
else
{
ResultData data = new ResultData(val.VariableType);
data.StartPosition = currentPos;
data.Label = val.Description + "-" + Convert.ToString(l + 1);
data.DCRatio = val.DCRatio;
fElem.ElementResults.Add(data);
if (val.VariableType.Equals(VariableType.Real) == true)
{
currentPos += 4;
}
else
{
currentPos += 2;
}
}
}
catch (Exception ex)
{
Debug.WriteLine("ERROR" + " = " + ex.Message);
}
}
}
}
}
不幸的是,这很难解释,而且我了解到我所提供的信息充其量是模糊的。但这实际上就是我可以使用的所有信息。我以前从未遇到过这种情况,所以我希望外面有人遇到过这种情况。
嗯,不用谢那些投下反对票但没有提供任何帮助的人,我至少绕过了这个问题。在执行的较早阶段从方法中调用的本机代码由于某种原因而导致了问题。仍然不知道为什么或在哪里,但是当我使用C#重写本机代码并消除本机调用时,一切正常。用C#重写那部分不是我的首选,但是它可以。
是,我启用了本机代码调试选项。