morlong 2021-03-22 11:20 采纳率: 0%
浏览 473
已结题

Marshal.copy 崩溃问题

我取了多张tiff图像,读到内存中为int[] 数组,而后通过线程池控制每张图像 尽心翻转操作。翻转使用的opencv,目前有一定的概率,在执行Marshal.Copy的时候,崩溃,使用try catch完全捕获不到,进程直接退出了。代码如下:

public static bool ImageMirrorCv(ref int[] image, int width, int height, int mirrorNum)
		{
			try
			{
				//以X轴,垂直翻转
				if (mirrorNum == 0)
				{
					Mat mt = new Mat(height, width, MatType.CV_32F);
					if ((mt.Height * mt.Width) != image.Length)
						return false;
					Marshal.Copy(image, 0, mt.Data, image.Count());
					Cv2.Flip(mt, mt, FlipMode.X);
					if ((mt.Height * mt.Width) != image.Length)
						return false;
					Marshal.Copy(mt.Data, image, 0, image.Count());
				}
				//以Y轴,水平翻转
				else if (mirrorNum == 1)
				{
					Mat mt = new Mat(height, width, MatType.CV_32F);
					if ((mt.Height * mt.Width) != image.Length)
						return false;
					Marshal.Copy(image, 0, mt.Data, image.Count());
					Cv2.Flip(mt, mt, FlipMode.Y);
					if ((mt.Height * mt.Width) != image.Length)
						return false;
					Marshal.Copy(mt.Data, image, 0, image.Count());
				}
				//XY翻转
				else if (mirrorNum == -1)
				{
					Mat mt = new Mat(height, width, MatType.CV_32F);
					if ((mt.Height * mt.Width) != image.Length)
						return false;
					Marshal.Copy(image, 0, mt.Data, image.Count());
					Cv2.Flip(mt, mt, FlipMode.XY);
					if ((mt.Height * mt.Width) != image.Length)
						return false;
					Marshal.Copy(mt.Data, image, 0, image.Count());
				}
				else
				{

				}
				return true;
			}
			catch(Exception ex)
			{
				Utility.LogControl.Error(ex.ToString());
				return false;
			}
			
		}

其中,输入输出,均为image,其为2048*2048的数据,height和width均为2048,mirrorNum控制翻转方向

报错后,系统事件查看器中显示:

目前使用频率大概在一天执行几万次,报错频率大概在一个月一次。

望大神不吝赐教

  • 写回答

1条回答 默认 最新

  • hxycsdn9159 2021-03-23 18:24
    关注

    从异常信息来看很明显是在拷贝数据的时候访问了不可访问的内存造成的,try catch只能捕获托管代码的异常,捕获不到这个异常是因为造成异常的模块“VCRUNTIME140_CLR0400.dll”是一个非托管的dll,你可以理解为你调用了Marsh.Copy方法,实际上是由CLR去间接通过一系列其他方法调用了这个非托管dll的方法实现的。从你的代码来看基本上可以断定是读写mt.Data这个指针指向的数据的时候访问了不可访问的地址。

    评论

报告相同问题?

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题