首页 > 其他分享 >使用.NET 4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出

使用.NET 4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出

时间:2023-11-16 15:13:54浏览次数:36  
标签:4.0 UnmanagedFunctionPointer long 3.5 uint PassThruConnect NET

本文介绍了使用.NET 4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在带有try catch块的点击处理程序中有一个简单的函数。如果我在此try catch块中抛出异常,则它会成功捕获该异常。

如果在抛出异常之前对非托管DLL进行了调用,则未处理该异常,并且没被捕获。

什么是无用的DLL调用会破坏我的程序异常处理?

如果我在调试模式下运行该程序,即使未对所有异常都选中异常中断,它仍会捕获异常。该应用程序不会崩溃,并且可以按预期运行。

如果我以调试时启动的方式运行程序,并在崩溃时单击debug,则会收到以下错误消息: Stack cookie检测代码检测到基于堆栈的缓冲区溢出 

编辑:
看来堆栈溢出中断了异常处理

我附上了一个导致崩溃的简化程序。

ISOConnection _comm;  //This is instantiated at another time in the same thread

//C# test function that crashes when run without a debugger attached
bool DoMagic()
{
    try
    {
        //if I uncomment this line the exception becomes unhandled and cannot be caught
        //_comm.ConnectISO15765();

        throw new Exception();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Caught exception")
    }

//Within ISOConnection class
public void ConnectISO15765(){
    ...
    lock(syncLock){
        uint returnCode = J2534Interface.PassThruConnect((uint)DeviceId, (uint)ProtocolID.ISO15765, (uint)ConnectFlag.NONE, (uint)BaudRate.ISO15765, ref ChannelId);


//C# UnmanagedFunctionPointer allocation code
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate uint PassThruConnect(uint deviceId, uint protocolId, uint flags, uint baudRate, ref uint channelId);
public PassThruConnect Connect;

[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);

m_pDll = NativeMethods.LoadLibrary(path);
...
pAddressOfFunctionToCall = NativeMethods.GetProcAddress(m_pDll, "PassThruConnect");
if (pAddressOfFunctionToCall != IntPtr.Zero)
    Connect = (PassThruConnect)Marshal.GetDelegateForFunctionPointer(
        pAddressOfFunctionToCall,
        typeof(PassThruConnect));

//C++ function declaration
long PassThruConnect(unsigned long DeviceID, unsigned long ProtocolID, unsigned long Flags, unsigned long Baudrate, unsigned long *pChannelID);

更新

如果我使用以下命令替换对UnmanagedFunctionPointer PassThurConnect的调用,则不会发生崩溃

[DllImport("op20pt32.dll", EntryPoint = "PassThruConnect", CallingConvention = CallingConvention.Cdecl)]
public static extern uint PassThruConnect2(uint deviceId, uint protocolId, uint flags, uint baudRate, ref uint channelId);

分配UnmanagedFunctionPointer时是否存在某些未执行的操作或执行不正确的操作会导致缺少

这个代码几周前似乎可以正常工作了,这甚至更奇怪了。主要变化是try catch在另一个线程中,而我没有使用lock(syncLock)。现在所有内容都在一个线程中,但是在BackgroundWorker中运行时也发生了相同的崩溃。

UPDATE#2问题半解决

好,所以我一步一步地回滚了我的提交,直到成功为止。改变的是我从.NET 3.5转到.NET 4.0 

.NET 3.5不会崩溃,无论是否连接调试器。如果未附加调试器,则.NET 4.0崩溃。为了排除代码中的错误,我只需删除日志的ConcurrentQueue(我使用的唯一4.0功能),然后将当前代码库转换回3.5,就不会收到此错误。

要确保100%是4.0的问题,然后我将代码库从3.5转换回4.0,并保留了ConcurrentQueue(实际上只是更改了构建选项并进行了重建),并且StackOverflow崩溃了又回来了。

我想使用4.0,有什么想法可以调试此问题吗?

编辑: .NET 4.6.1也崩溃

更新#3
http://codenition.blogspot.com.au/2010/05/pinvokestackimbalance-in-net-40i-beg .html

在.NET 3.5中,显然pinvokestackimbalance基本上被忽略了,所以问题仍然存在,只是不会使我的应用程序崩溃。

添加以下代码t o当过渡回托管代码时,App.Config导致.NET修复堆栈。性能稍有下降,但可以解决问题。

虽然这确实可以解决问题,但我想知道UnmanagedFunctionPointer出了什么问题,从而导致了问题

<configuration> 
  <runtime> 
    <NetFx40_PInvokeStackResilience enabled="1"/>

编辑:此线程不是重复的,另一个已删除... 

推荐答案

好,所以问题在于调用约定应该是StdCall而不是Cdecl 

这是有道理的,因为通用J2534 API文档指定了以下标头。尽管我提供的头文件没有制定此规范。 

extern "C" long WINAPI PassThruConnect
(
unsigned long ProtocolID;
unsigned long Flags
unsigned long *pChannelID
)

其中WINAPI也称为StdCall不像大多数C / C ++库通常使用的Cdecl。

.NET 3.5允许使用错误的调用约定并修复堆栈。从4.0版本开始,情况不再如此,并且将引发PinvokeStackImbalance异常。

您可以强制4.0也通过将以下代码添加到App.Config来修复堆栈。

<configuration> 
  <runtime> 
    <NetFx40_PInvokeStackResilience enabled="1"/>

或者您也可以通过将Cdecl更改为StdCall来简单地修改呼叫约定:

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
public delegate uint PassThruConnect(uint deviceId, uint protocolId, uint flags, uint baudRate, ref uint channelID);

这篇关于使用.NET 4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

参考链接:https://www.it1352.com/1792610.html

标签:4.0,UnmanagedFunctionPointer,long,3.5,uint,PassThruConnect,NET
From: https://www.cnblogs.com/1175429393wljblog/p/17836273.html

相关文章

  • 一个Git clone仓库的指定目录命令对比国内外常见AI(一)使用ChatGPT3.5
    通常情况下,我们会克隆整个Git仓库,但有时候我们只需要其中某一个目录或文件,这时候只克隆子目录会更加方便。这个需求好像不是经常用到,搜索结果也是五花八门,有些完全达不到要求,正好用这个机会测试一下最近大火的AI看看是否足够智能。国外ChatGPT3.5(找一个可以访问的就好,ChatGPT4没找......
  • VS2022 安装 .NET Framework 4.0 和 .NET Framework 4.5 的方法
    解决方法1、下载.NETFramework框架.NETFramework4.5.2.NETFramework4.5.1.NETFramework4.5.NETFramework4.0microsoft.netframework.referenceassemblies.net40.1.0.2.nupkg30.7M·百度网盘microsoft.netframework.referenceassemblies.net45.1.0.2......
  • kylin4.0.1部署过程
    部署环境hadoop3.0.0-cdh6.3.2hive3.1.2kylin4.0.1spark3.1.1一、准备工作1、下载apache-kylin-4.0.1-bin-spark3.tar.gz并解压到本地目录,将spark-3.1.1-bin-hadoop2.7.tgz下载解压后放在kylin目录下2、给解压后的kylin和spark文件夹改个名mvapache-kylin-4.0.1-bi......
  • 安防监控系统EasyCVR v3.4.0版本首页界面更新调整功能大汇总
    安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、视频能力灵活,能对外分发RTMP、RTSP、HTTP-......
  • 尊嘟假嘟,Zabbix 4.0 要停更?! 裂墙推荐升级
    尊嘟!Zabbix4.0版本将于今年10月31日将不再更新及支持,强烈推荐大家升级!目录Zabbix版本支持期限当前Zabbix最新的LTS版本为6.0,发布于2022年2月。Zabbix4.0版本发布于2018年10月,至今年10月31日将不再更新,强烈推荐大家升级。LTS版本有3年的全面支持和2年的部分支持(仅限严重级别和安......
  • 【4.0】Go语言语法基础之函数
    【一】函数基础【1】语法func关键字函数名(形参1形参1的类型,形参2形参2的类型)(返回值类型){函数体(函数体的内容和缩进无关,只要是在大括号内,都是函数体内容)}在Python中需要先定义函数再使用在Go中不需要先定义再使用funcmain(){}【2】无参数无返回值......
  • Ubuntu14.04 Server 升级到14.10 的方法
    如果想从Ubuntu14.04/13.10/13.04/12.10/12.04或者更老的版本升级到14.10,只要遵循下面给出的步骤。注意,你不能直接从13.10升级到14.10。你应该先将13.10升级到14.04在从14.04升级到14.10。下面是详细步骤。下面的步骤不仅能用于14.10,也兼容于一些像Lubuntu14.10,Kubuntu14.10和Xu......
  • [Mac软件]Adobe Media Encoder 2024 V24.0.2免激活版
    软件说明使用MediaEncoder,您将能够处理和管理多媒体。插入、转码、创建代理版本,并几乎以任何可用的格式输出。在应用程序中以单一方式使用多媒体,包括PremierePro、AfterEffects和Audition。紧密整合与AdobePremierePro、AfterEffects、Audition和其他应用程序无缝快速地交互......
  • What's new in Pika v3.5.0
    时隔两年,Pika社区正式发布经由社区50多人参与开发并在360生产环境验证可用的v3.5.0版本,新版本在提升性能的同时,也支持了Codis集群部署,BlobDBKV分离,增加Exporter等新特性。我们将详细介绍该版本引入的重要新特性。1去除Rsync在v3.5.0版本之前,Pika使用Rsync工具......
  • 冰橙Ai- ChatGPT开放接口最新版4.0 1106接口 gpt-4-1106-preview gpt-3.5-turbo-1106
    冰橙Ai-ChatGPT开放接口最新版4.01106接口gpt-4-1106-previewgpt-3.5-turbo-1106 图像生成DALL·E3多模态接口冰橙GPTchatGPT开放接口使用说明 【接入了腾讯云内容安全检测】冰橙GPT稳定提供API接口服务定时有人进行问题排查处理1小时内问题响应接入了腾讯云的内......