当前位置: 首页 > news >正文

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

本文介绍了使用.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屋!

参考链接:使用.NET 4.0、3.5时,UnmanagedFunctionPointer导致堆栈溢出 - IT屋-程序员软件开发技术分享社区

相关文章:

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

本文介绍了使用.NET 4.0、3.5时&#xff0c;UnmanagedFunctionPointer导致堆栈溢出的处理方法&#xff0c;对大家解决问题具有一定的参考价值&#xff0c;需要的朋友们下面随着小编来一起学习吧&#xff01; 问题描述 我在带有try catch块的点击处理程序中有一个简单的函数。…...

jbase打印导出实现

上一篇实现了虚拟M层&#xff0c;这篇基于虚拟M实现打印导出。 首先对接打印层 using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; using System.Xml;namesp…...

特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)

特征缩放和转换 您需要应用于数据的最重要的转换之一是功能扩展。除了少数例外&#xff0c;机器学习算法在输入数值属性具有非常不同的尺度时表现不佳。住房数据就是这种情况:房间总数约为6至39320间&#xff0c;而收入中位数仅为0至15间。如果没有任何缩放&#xff0c;大多数…...

前端算法面试之堆排序-每日一练

如果对前端八股文感兴趣&#xff0c;可以留意公重号&#xff1a;码农补给站&#xff0c;总有你要的干货。 今天分享一个非常热门的算法--堆排序。堆的运用非常的广泛&#xff0c;例如&#xff0c;Python中的heapq模块提供了堆排序算法&#xff0c;可以用于实现优先队列&#xf…...

C++之set/multise容器

C之set/multise容器 set基本概念 set构造和赋值 #include <iostream> #include<set> using namespace std;void PrintfSet(set<int>&s) {for(set<int>::iterator it s.begin();it ! s.end();it){cout<<*it<<" ";}cout&l…...

本地部署AutoGPT

我们都了解ChatGPT&#xff0c;是Openai退出的基于GPT模型的新一代 AI助手&#xff0c;可以帮助解决我们在多个领域的问题。但是你会发现&#xff0c;在某些问题上&#xff0c;ChatGPT 需要经过不断的调教与沟通&#xff0c;才能得到接近正确的答案。对于你不太了解的领域领域&…...

ProtocolBuffers(protobuf)详解

目录 前言特点语法定义关键字JSON与Protocol Buffers互相转换gRPC与Protocol Buffers的关系 前言 Protocol Buffers&#xff08;通常简称为protobuf&#xff09;是Google公司开发的一种数据描述语言&#xff0c;它能够将结构化数据序列化&#xff0c;可用于数据存储、通信协议…...

HTTP 到 HTTPS 再到 HSTS 的转变

近些年&#xff0c;随着域名劫持、信息泄漏等网络安全事件的频繁发生&#xff0c;网站安全也变得越来越重要&#xff0c;也促成了网络传输协议从 HTTP 到 HTTPS 再到 HSTS 的转变。 HTTP HTTP&#xff08;超文本传输协议&#xff09; 是一种用于分布式、协作式和超媒体信息系…...

清华学霸告诉你:如何自学人工智能?

清华大学作为中国顶尖的学府之一&#xff0c;培养了许多优秀的人才&#xff0c;其中不乏在人工智能领域有所成就的学霸。通过一位清华学霸的经验分享&#xff0c;揭示如何自学人工智能&#xff0c;帮助你在这场科技浪潮中勇往直前。 一、夯实基础知识 数学基础&#xff1a;学习…...

Ubuntu 安装VMware Tools选项显示灰色,如何安装VMware Tools

切换apt源为阿里云&#xff1a; https://qq742971636.blog.csdn.net/article/details/134291339 只要你的网络没问题&#xff0c;你直接执行这几个命令&#xff0c;重启ubuntu虚拟机即可、 sudo dpkg --configure -a sudo apt-get autoremove open-vm-tools sudo apt-get ins…...

SpringBoot 2.x 实战仿B站高性能后端项目

SpringBoot 2.x 实战仿B站高性能后端项目 下栽の地止&#xff1a;请看文章末尾 通常SpringBoot新建项目&#xff0c;默认是集成了Maven&#xff0c;然后所有内容都在一个主模块中。 如果项目架构稍微复杂一点&#xff0c;就需要用到Maven多模块。 本文简单概述一下&#xff0c…...

vscode文件夹折叠问题

今天发现一个vscode的文件夹显示的问题&#xff0c;首先是这样的&#xff0c;就是我的文件夹里又一个子文件夹&#xff0c;子文件夹里有一些文件&#xff0c;但是我发现无法折叠起这个子文件夹&#xff0c;总是显示全部的文件&#xff0c;这让我备份很难&#xff0c;具体参考 h…...

4-flask-cbv源码、Jinja2模板、请求响应、flask中的session、flask项目参考

1 flask中cbv源码 2 Jinja2模板 3 请求响应 4 flask中的session 5 flask项目参考 1 flask中cbv源码 ***flask的官网文档&#xff1a;***https://flask.palletsprojects.com/en/3.0.x/views/1 cbv源码执行流程1 请求来了&#xff0c;路由匹配成功---》执行ItemAPI.as_view(item…...

2.Pandas数据预处理

2.1 数据清洗 以titanic数据为例。 df pd.read_csv(titanic.csv) 2.1.1 缺失值 &#xff08;1&#xff09;缺失判断 df.isnull() &#xff08;2&#xff09;缺失统计 # 列缺失统计 df.isnull().sum(axis0) # 行缺失统计 df.isnull().sum(axis1) # 统计缺失率 df.isnu…...

C# IEnumerable<T>介绍

IEnumerable 是 C# 中的一个接口&#xff0c;它是 .NET Framework 中的集合类型的基础。任何实现了 IEnumerable 接口的对象都可以进行 foreach 迭代。 IEnumerable 只有一个方法&#xff0c;即 GetEnumerator&#xff0c;该方法返回一个 IEnumerator 对象。IEnumerator 对象用…...

九洲

《九洲》 作者&#xff0f;罗光记 九洲春色映朝阳&#xff0c; 洲渚风光似画廊。 柳絮飘飞花似雪&#xff0c; 九州繁华共锦裳。 水波荡漾鱼儿跃&#xff0c; 洲边鸟语唤晨光。 春风拂过千里岸&#xff0c; 九洲儿女笑语扬。...

基于Genio 700 (MT8390)芯片的AR智能眼镜方案

AR眼镜是一种具有前所未有发展机遇的设备&#xff0c;无论是显示效果、体积还是功能都有明显的提升。AR技术因其智能、实时、三维、多重交互和开放世界的特点备受关注。 AR眼镜集成了AR技术、语音识别、智能控制等多项高科技功能&#xff0c;可以帮助用户实现更加便捷、高效、个…...

锐捷OSPF认证

一、知识补充 1、基本概述 OSPF区域认证和端口认证是两种不同的认证机制&#xff0c;用于增强OSPF协议的安全性。 OSPF区域认证&#xff08;OSPF Area Authentication&#xff09;&#xff1a;这种认证机制是基于区域的。在OSPF网络中&#xff0c;每个区域都可以配置一个区域…...

M2 Mac Xcode编译报错 ‘***.framework/‘ for architecture arm64

In /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP(anim_decode.o), building for iOS Simulator, but linking in object file built for iOS, file /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP for architecture arm64 这是我当时编译模拟器时报…...

Python算法题2023 输出123456789到98765432中完全不包含2023的数有多少

题目&#xff1a; 无输入&#xff0c;只需输出结果&#x1f910; 这个数字比较大&#xff0c;小伙伴们运行的时候要给代码一点耐心嗷つ﹏⊂ &#xff0c;下面是思路&#xff0c;代码注释也很详细&#xff0c;大致看一下吧&#xff08;&#xff3e;∀&#xff3e;●&#xff09…...

ubuntu服务器部署ai应用如何通过taotoken实现多模型稳定调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Ubuntu 服务器部署 AI 应用如何通过 Taotoken 实现多模型稳定调用 在 Ubuntu 服务器上部署 AI 应用时&#xff0c;开发者常常面临一…...

WPF-Control核心架构思想

WPF-Control 项目架构详解 一、核心架构思想 这个项目的架构可以用一句话概括&#xff1a;控件负责显示&#xff0c;服务负责能力&#xff0c;模块负责组合&#xff0c;主题负责外观&#xff0c;ApplicationBase 负责生命周期&#xff0c;IOC 负责连接所有对象。这是一种典型的…...

构建企业级智能设计转换桥梁:Unity Figma Bridge高性能自动化集成方案深度解析

构建企业级智能设计转换桥梁&#xff1a;Unity Figma Bridge高性能自动化集成方案深度解析 【免费下载链接】UnityFigmaBridge Easily bring your Figma Documents, Components, Assets and Prototypes to Unity 项目地址: https://gitcode.com/gh_mirrors/un/UnityFigmaBrid…...

保姆级教程:在VMware上安装BCLinux for Euler 21.10最小化系统(附镜像校验与网络配置)

虚拟化环境实战&#xff1a;BCLinux for Euler 21.10最小化系统部署全指南 在云计算和容器化技术盛行的今天&#xff0c;本地虚拟化环境仍然是开发者进行系统测试、软件验证的重要工具。BCLinux for Euler作为一款针对企业级场景优化的Linux发行版&#xff0c;其21.10版本在性能…...

MarkdownViewer++:Notepad++终极Markdown实时预览插件完整指南

MarkdownViewer&#xff1a;Notepad终极Markdown实时预览插件完整指南 【免费下载链接】MarkdownViewerPlusPlus A Notepad Plugin to view a Markdown file rendered on-the-fly 项目地址: https://gitcode.com/gh_mirrors/ma/MarkdownViewerPlusPlus 你是否曾在Notepa…...

如何快速搞定GTNH中文汉化:新手友好的终极指南

如何快速搞定GTNH中文汉化&#xff1a;新手友好的终极指南 【免费下载链接】Translation-of-GTNH GTNH整合包的汉化 项目地址: https://gitcode.com/gh_mirrors/tr/Translation-of-GTNH 还在为GTNH&#xff08;GregTech: New Horizons&#xff09;这个顶级整合包的全英文…...

COLMAP稠密点云太稀疏?OpenMVS点云又太密?试试这个‘黄金搭档’配置方案

COLMAP与OpenMVS混合重建&#xff1a;如何实现点云密度与计算效率的黄金平衡 在三维重建领域&#xff0c;我们常常面临一个两难选择&#xff1a;COLMAP生成的稠密点云往往过于稀疏&#xff0c;导致最终网格模型细节不足&#xff1b;而OpenMVS自带的稠密重建又容易产生过度密集的…...

从协议到实战:深度剖析WiFi Deauth攻击的底层原理与Kali工具链应用

1. WiFi Deauth攻击的本质&#xff1a;从协议层理解管理帧 当你用手机连接咖啡厅的WiFi时&#xff0c;背后其实在进行一场精密的无线协议对话。802.11标准中定义了三种关键帧类型&#xff1a;数据帧负责传输网页内容&#xff0c;控制帧协调信道占用&#xff0c;而管理帧则是连…...

避开这些坑:Tessent Shell中MBIST流程的DRC检查与调试指南

避开这些坑&#xff1a;Tessent Shell中MBIST流程的DRC检查与调试指南 在芯片设计领域&#xff0c;可测试性设计&#xff08;DFT&#xff09;是确保产品质量的关键环节。而作为DFT的重要组成部分&#xff0c;存储器内建自测试&#xff08;MBIST&#xff09;的实现质量直接影响着…...

LangChain4j-examples:基于Java的AI智能体工作流编排深度解析与实践指南

LangChain4j-examples&#xff1a;基于Java的AI智能体工作流编排深度解析与实践指南 【免费下载链接】langchain4j-examples 项目地址: https://gitcode.com/GitHub_Trending/la/langchain4j-examples LangChain4j-examples是一个面向Java开发者的AI智能体工作流编排框…...