<TensorRT> 部署时发生“引发了异常: 读取访问权限冲突。 this 是 nullptr”

部署TensorRT时发生的问题总结

报错:“引发了异常: 读取访问权限冲突。 this 是 nullptr”
原因:

  1. cuda the launch timed out and was terminated
    解决方案
    ①安装cuda(需要里面带的Nsight Monitor)
    ②使用管理员权限打开Nsight Monitor(在开始界面,找到Nsight Monitor,右键管理员身份运行)
    ③右下角找到Nsight Monitor,右键打开Options,将TDR关闭
    在这里插入图片描述
  2. [runtime.cpp::deserializeCudaEngine::76] Error Code 4: Internal Error (Engine deserialization failed.)
    解决方案:在自己电脑上将onnx文件重新生成一下engine,其他设备上拷贝过来的engine可能不可用。
  3. 报错
    `[04/07/2023-11:11:35] [I] [TRT] Loaded engine size: 17 MiB
    [04/07/2023-11:11:35] [E] [TRT] 1: [pluginV2Runner.cpp::nvinfer1::rt::load::300] Error Code 1: Serialization (Serialization assertion creator failed.Cannot deserialize plugin since corresponding IPluginCreator not found in Plugin Registry)
    [04/07/2023-11:11:35] [E] [TRT] 4: [runtime.cpp::nvinfer1::Runtime::deserializeCudaEngine::66] Error Code 4: Internal Error (Engine deserialization failed.)
    解决方案:
    1)添加#include "NvInferPlugin.h"的头文件
#include "NvInferPlugin.h"

2)在加载模型的代码处,进行插件注册

nvinfer1::IRuntime* runtime = nvinfer1::createInferRuntime(sample::gLogger.getTRTLogger());
initLibNvInferPlugins(&sample::gLogger.getTRTLogger(),""); //加这一句
ICudaEngine* engine = runtime->deserializeCudaEngine(data.get(), length);

参考文档:https://blog.csdn.net/ListenAlone/article/details/125014592
https://blog.csdn.net/qq_42178122/article/details/128046706
`

  1. 报错2
    [05/09/2023-16:50:02] [E] [TRT] 1: [convBaseRunner.cpp::nvinfer1::rt::task::CaskConvBaseRunner::execute::271] Error Code 1: Cask (Cask convolution execution)
    [05/09/2023-16:50:02] [E] [TRT] 1: [checkMacros.cpp::nvinfer1::catchCudaError::202] Error Code 1: Cuda Runtime (invalid resource handle)
    解决方案::英伟达提供的方案是"This error is more related to the CUDA context issue.Please make sure you’re handling the CUDA context/stream correctly." —译:“此错误与CUDA上下文问题更相关。请确保正确处理CUDA上下文/流。”
    因此,查阅资料,发现CUDA runtime不提供对CUDA上下文的直接访问,它通过延迟初始化(deferred initialization)来创建上下文。每一个 CUDART库调用和内核调用都会检查上下文是否是当前使用的,如果必要的话,创建CUDA上下文(使用之前用 cudaSetDevice, cudaSetDeviceFlags(),cudaGLSetGLDevice()等函数设置状态)。
    所以,尝试在推理之前加一句cudaSetDevice(0)问题就解决了。(如果是多GPU,可以更改gpuid,我这一张显卡所以就默认为0)
    参考链接:https://blog.csdn.net/hjxu2016/article/details/109354226
    https://blog.csdn.net/wsl_longwudi/article/details/126940635

  2. 报错3
    exe文件调用tensorrt的dll时,一开始报了“尝试读取或写入受保护的内存”,跟进代码后发现“引发了异常: 读取访问权限冲突。 this 是 nullptr”,进一步捕获vs输出,显示如下异常:
    0x00007FFFA17DCD29 处(位于 ******.exe 中)引发的异常: Microsoft C++ 异常: nvinfer1::InternalError,位于内存位置 0x000000A97E7FD080 处。
    0x00007FFFA17DCD29 处(位于 *******.exe 中)引发的异常: Microsoft C++ 异常: [rethrow],位于内存位置 0x0000000000000000 处。
    解决方案: 一定要将tensorrt的DLL放置在exe根目录下!

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个程序错误,意味着在读取访问权限发生冲突,导致程序异常。错误信息中提到了变量 p 是 nullptr,也就是空指针,可能是因为程序在访问一个空指针发生了错误。需要检查程序代码,找出具体的错误原因并进行修复。 ### 回答2: 这个错误是在C++编程中常见的错误之一。通常会在代码中使用指针出现。所谓的指针,就是一个存储地址的变量。当我们声明一个指针,它会指向一个特定的内存地址。而当我们使用指针,它会去取出该地址中存储的值。为了更好地描述这个错误,我们需要回顾一下指针的基础概念。 在使用指针,我们需要注意一些事情,如指针的初始化和访问权限等。指针的初始化是指在声明指针变量的候,为该指针变量分配内存,并将其指向一个有效的地址。而访问权限是指程序是否有权访问该指针所指向的地址。 在出现 “引发异常: 读取访问权限冲突。 p 是 nullptr。” 的错误,意味着程序试图读取一个无效的地址,即指针指向了空地址。要解决这个问题,我们需要检查代码中声明和使用指针的过程。 当我们使用指针,应当先检查指针是否为nullptr。如果是,则说明该指针没有指向任何有效的地址。在这种情况下,我们应该先为该指针进行初始化。如果指针已经初始化,那么我们需要检查该指针是否有权访问该地址。如果指针没有访问权限,则需要重新编写代码,以确保程序能够访问该地址。 总之,当出现 “引发异常: 读取访问权限冲突。 p 是 nullptr。” 的错误,我们应该先检查指针的初始化和访问权限。通过仔细检查代码,我们可以找到并解决这个问题,以确保程序能够正常运行。 ### 回答3: 这个问题多半是出现在C++编程语言中,通常是在尝试访问一个指针p所指向的内存地址的候出现的。如果内存地址没有被正确的分配和初始化,就会出现访问权限冲突的错误。 在C++中,指针是一种非常有用的数据类型,它可以用来存储和操作内存地址。指针通常用来动态地分配内存,也可用于传递函数参数,访问数组,以及创建复杂的数据结构。但是,如果指针在使用之前没有初始化,就会指向一个不确定的内存地址,这个地址可能已经被其他变量或程序占用,导致访问权限冲突的错误。 在代码中出现"p是nullptr"这种错误信息,通常是因为程序在尝试使用一个没有被初始化的指针p。nullptr是C++11标准新增的关键字,表示空指针,在使用可以避免未经初始化的指针导致的访问权限冲突错误。 要解决这个问题,首先应该检查代码中是否正确的初始化了指针p,另外,还应该确保程序分配的内存大小足够并没有被其他变量或程序占用。因此,在使用指针,要牢记正确的内存管理方法,避免由于指针使用不当导致的访问权限冲突错误。 总之,当程序出现"引发异常: 读取访问权限冲突,p是nullptr",需要检查程序中的指针是否被正确的初始化,确保分配的内存足够且未被占用,以及注意正确的内存管理方法,以避免指针使用不当导致的访问权限冲突错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值