花费了比较长的时间,解决了编译过程中遇到的许多问题后,终于把这个开源的工程编译好了,运行post build 脚本将需要的链接文件拷贝好。正当我以为没有任何问题了,双击可执行程序运行。

结果运行起来的时候报错了,提示无法正常启动,根据这个这个报错的提示,网上搜了一下,都说是缺少dll库导致的,于是将post build脚本又运行了一遍,重新双击打开可执行程序,还是报一样的错。

那么是缺少那个dll库导致的呢?于是我打开系统的事件查看器,从里面找到了应用程序错误事件,点击看到了详细信息,从描述来看出错的模块是libprotobufd.dll,是在运行这个dll的过程中出现的异常,并非缺少dll导致。

{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "(msvc) launch","type": "cppvsdbg","request": "launch","program": "D:\\Kicad\\kicad-source-mirror\\build\\out\\bin\\kicad.exe"}]
}

为了进一步弄清楚这个库出错的原因和位置,于是在vscode编辑器中将C/C++相关的插件安装上,设置好debug条件,运行debug功能后,跳转到了出现异常的代码位置。

从给的错误信息可以看出来_Pnext是一个非法值,那么这个值为什么是一个非法值,目前猜测它是一个空指针,或者指向的内存不对,目前只是有这样一个概念,带着这样的疑惑继续分析原因。

_EXPORT_STD template <class _Ty, class _Other = _Ty>
_CONSTEXPR20 _Ty exchange(_Ty& _Val, _Other&& _New_val)noexcept(conjunction_v<is_nothrow_move_constructible<_Ty>, is_nothrow_assignable<_Ty&, _Other>>) {// assign _New_val to _Val, return previous _Val_Ty _Old_val = static_cast<_Ty&&>(_Val);_Val         = static_cast<_Other&&>(_New_val);return _Old_val;
}

exchange的作用是将第一个参数设置成第二个参数的值,然后返回第一个参数的值,所以auto _Pnext = _STD exchange(_Myproxy->_Myfirstiter, nullptr)可以理解为:

_Pnext = _Myproxy->_Myfirstiter;

_Myproxy->_Myfirstiter = nullptr;

上述只是简单理解这个函数的功能,这样看这里也没有问题

到了这里我们还是无法知道_Pnext指向的区域为什么变成非法的,还有就是_Pnext到底指向的是什么,也就是它到底是什么,怎么来的,于是根据发生异常的调用栈进一步追踪,看一下具体是怎么发生的。根据调用栈我们看到了一个明显的可能有问题的地方那就是std::string::~basic_string(),这里先猜测string对象析构的时候发生了异常,析构的时候一般会去释放资源,是不是释放的资源出来问题,所以才导致的异常。

bool EncodedDescriptorDatabase::DescriptorIndex::AddSymbol(absl::string_view symbol) {SymbolEntry entry = {static_cast<int>(all_values_.size() - 1),EncodeString(symbol)};std::string entry_as_string = entry.AsString(*this);// We need to make sure not to violate our map invariant.// If the symbol name is invalid it could break our lookup algorithm (which// relies on the fact that '.' sorts before all other characters that are// valid in symbol names).if (!ValidateSymbolName(symbol)) {ABSL_LOG(ERROR) << "Invalid symbol name: " << entry_as_string;return false;}auto iter = FindLastLessOrEqual(&by_symbol_, entry);if (!CheckForMutualSubsymbols(entry_as_string, &iter, by_symbol_.end(),*this)) {return false;}// Same, but on by_symbol_flat_auto flat_iter =FindLastLessOrEqual(&by_symbol_flat_, entry, by_symbol_.key_comp());if (!CheckForMutualSubsymbols(entry_as_string, &flat_iter,by_symbol_flat_.end(), *this)) {return false;}// OK, no conflicts.// Insert the new symbol using the iterator as a hint, the new entry will// appear immediately before the one the iterator is pointing at.by_symbol_.insert(iter, entry);return true;
}

于是继续追踪代码里面是哪个执行造成的,还是根据前面的调用栈,我们看到执行完AddSymbol后,会调用~basic_string(),那么根据上面的代码来看,应该是entry_as_string这个对象的使用有问题。

根据debug信息,看到entry_as_string的内存有问题,到这来还不知道是因为被释放了,还是本身创建出来的就有问题,继续追踪这个是怎么创建出来的。

std::string AsString(const DescriptorIndex& index) const {auto p = package(index);return absl::StrCat(p, p.empty() ? "" : ".", symbol(index));}
std::string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c) {std::string result;// Use uint64_t to prevent size_t overflow. We assume it is not possible for// in memory strings to overflow a uint64_t.constexpr uint64_t kMaxSize = uint64_t{std::numeric_limits<size_t>::max()};const uint64_t result_size = static_cast<uint64_t>(a.size()) +static_cast<uint64_t>(b.size()) +static_cast<uint64_t>(c.size());ABSL_INTERNAL_CHECK(result_size <= kMaxSize, "size_t overflow");strings_internal::STLStringResizeUninitialized(&result, static_cast<size_t>(result_size));char* const begin = &result[0];char* out = begin;out = Append(out, a);out = Append(out, b);out = Append(out, c);assert(out == begin + result.size());return result;
}

这里重点是std::string result;这个result有问题,但是有实在看不出代码哪里有问题,于是只能继续debug,进入这个函数后一步步运行,看一下具体是哪里出了问题。

在运行的过程中,这个result的就没有显示出来,它的内存是什么,指向哪里根本不知道。

只知道这个函数返回的时候,entry_as_string指向了一个错误的内存,最终导致崩溃,目前从debug的过程来看不出具体是什么原因导致的问题。

于是写了一段类似的测试代码,看看能不能复现到这样的问题,也可以对比这个过程中有哪些不一样,看看能不能找出根本原因。

测试代码在运行的过程中没有出错,只能看到它们不一样的地方

异常代码测试代码
1std::string result 没有跑构造函数std::string result 正常跑构造函数
2debug过程没有显示result的信息debug过程会显示result的信息
3函数里面的begin、out等变量也没有信息函数里面的begin指向和显示没有问题

目前猜测可能是std::string StrCat(const AlphaNum& a, const AlphaNum& b, const AlphaNum& c) 函数里面的代码被优化了导致的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909657.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909657.shtml
英文地址,请注明出处:http://en.pswp.cn/news/909657.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

资深Java工程师的面试题目(一)并发编程

以下是几道针对Java并发编程的面试题&#xff0c;涵盖基础知识、高级概念和实际应用场景&#xff0c;适合资深Java工程师的面试评估&#xff1a; 1. 线程池与任务调度 题目: 描述Java线程池的核心参数&#xff08;如corePoolSize、maximumPoolSize、keepAliveTime等&#xff…

解决Spark4.0.0依赖问题

Apache Spark 4.0.0 冲突解决指南 1. 问题背景 在尝试运行一个基于 Apache Spark 4.0.0 的 Java 应用程序。根据 Spark 4.0.0 的发布说明&#xff0c;该版本默认支持 Scala 2.13 和 JDK 17。在初始设置和运行过程中&#xff0c;遇到了以下主要问题&#xff1a; 依赖冲突 (PO…

什么是SeaTunnel

SeaTunnel&#xff1a;高性能、分布式数据集成平台 1. 什么是SeaTunnel&#xff1f; SeaTunnel&#xff08;原名Waterdrop&#xff09;是一个高性能、分布式、可扩展的数据集成平台&#xff0c;专为大规模数据同步、ETL&#xff08;Extract, Transform, Load&#xff09;和实…

Android 使用OkHttp 下载文件失败问题定位和修复

一、背景 使用Okhttp下载文件时,存在失败情况,刚开始以为是网络问题,后面添加相关日志发现,是在网络波动比较大的情况下,被判为timeout超时,结束了下载任务。 二、解决方案 有问题的下载配置写法: 注:这里只是展示配置下载的关键代码 val client OkHttpClient()val request…

【Docker基础】Docker核心概念:命名空间(Namespace)之PID详解

目录 引言 1 基础概念回顾 1.1 命名空间概述 1.2 命名空间的类型 2 PID命名空间详解 2.1 PID命名空间的概念 2.2 PID命名空间的作用 2.3 PID命名空间的工作原理 2.3.1 PID命名空间的创建与销毁 2.3.2 PID命名空间的层次结构 2.3.3 PID命名空间的进程ID映射 3 PID命…

SSM框架:企业级Java开发利器

SSM框架详解&#xff1a;Java企业级开发的核心基石 SSM框架是Java企业级开发中最流行的框架组合&#xff0c;由Spring、Spring MVC和MyBatis三大框架整合而成。这个轻量级的框架组合为Java开发者提供了高效、灵活的企业级应用解决方案。 一、SSM框架组成解析 1. Spring框架 …

网络安全中的人工智能应用

人工智能&#xff08;AI&#xff09;在网络安全中的应用从根本上改变了企业抵御网络威胁的方式。它利用先进的机器学习&#xff08;ML&#xff09;算法分析多源海量风险数据&#xff0c;挖掘威胁模式&#xff0c;从而更轻松地快速应对新兴风险。AI 能以惊人的速度和准确性帮助发…

Vue + Spring Boot 前后端交互实践:正确使用 `Content-Type: application/json` 及参数传递方式

在前后端分离开发中&#xff0c;前端通过 HTTP 请求与后端进行数据交互是常见的操作。其中&#xff0c;Content-Type 是决定请求体格式的重要字段之一。本文将以一个具体的例子出发&#xff0c;讲解如何在 Vue 前端 使用 Axios 发送 JSON 格式请求&#xff0c;并在 Spring Boot…

微服务拆分 SpringCloud

拆分原则 什么时候拆分 大多数小型项目&#xff1a; 一般是先采用单体架构&#xff0c;随着用户规模扩大、业务复杂后再逐渐拆分为微服务架构&#xff08;前易后难&#xff09;。确定的大型项目&#xff1a; 资金充足&#xff0c;目标明确&#xff0c;可以直接选择微服务架构…

DataX Hive写插件深度解析:从数据写入到Hive表关联实战

引言 在大数据处理流程中&#xff0c;将数据高效写入Hive表是数据仓库建设的关键环节。DataX作为阿里巴巴开源的数据同步工具&#xff0c;其Hive写插件&#xff08;Hdfswriter&#xff09;提供了将数据写入HDFS并与Hive表无缝关联的能力。本文将系统介绍Hdfswriter的功能特性、…

基于国产USRP搭建十六通道同步采集系统, 耗费200万 欢迎免费体验

随着无线通信、雷达探测和电子侦察等技术的发展&#xff0c;多通道信号同步采集的需求日益突出。我司基于8台USRP-LW N321设备&#xff0c;构建了一套高精度十六路通道信号同步采集系统&#xff0c;该系统通过并行采集与精确时频对齐&#xff0c;可为空间谱测向和MIMO系统等关键…

《前端编译工具源映射配置:Webpack与Gulp的深度剖析》

当我们深入探索不同前端编译工具时&#xff0c;Webpack与Gulp在源映射配置上的差异与特色&#xff0c;如同隐藏在代码深处的神秘宝藏&#xff0c;等待我们去挖掘、去解读。 Webpack作为现代前端构建的核心工具&#xff0c;在源映射配置方面展现出了高度的灵活性与可定制性。它…

4. 时间序列预测的自回归和自动方法

4.1自回归 自回归是一种时间序列预测方法&#xff0c;仅依赖于时间序列的先前输出&#xff1a;该技术假设下一个时间戳的未来观测值与先前时间戳的观测值存在线性关系。 在自回归中&#xff0c;前一个时间戳的输出值成为预测下一个时间戳的输入值&#xff0c;并且误差遵循简单线…

Android 多屏幕旋转控制原理与实战

在嵌入式设备、双显示终端或定制系统中&#xff0c;Android 多屏幕控制&#xff08;尤其是屏幕方向旋转&#xff09;是一个兼具挑战与价值的功能模块。本文将深入分析如何识别多个显示、如何通过系统 API 控制旋转&#xff0c;并讨论为何某些 displayId 无法旋转。 &#x1f4c…

faiss上的GPU流程,GPU与CPU之间的联系

GPU使用流程 1、初始化阶段 1.1:初始化GPU资源对象 目的: 为GPU上的操作分配和管理资源,例如临时内存和CUDA流。 操作: 创建StandardGpuResources对象来管理GPU的内存和计算资源。例如: faiss::gpu::StandardGpuResources res; res.setTempMemory(1024 * 1024 * 512); …

在CentOS 7系统安装PostgreSQL 15时出现`libzstd.so.1`依赖缺失问题

--> 正在处理依赖关系 libzstd.so.1()(64bit)&#xff0c;它被软件包 postgresql15-server-15.13-1PGDG.rhel7.x86_64 需要---> 软件包 python3-pip.noarch.0.9.0.3-8.el7 将被 安装---> 软件包 python3-setuptools.noarch.0.39.2.0-10.el7 将被 安装--> 解决依赖关…

走进Coinate|迪拜第二大交易平台如何构建极速金融引擎

在加密资产交易飞速发展的今天&#xff0c;技术实力已成为交易平台生存与发展的核心竞争力。与那些高调营销却技术薄弱的平台不同&#xff0c;来自迪拜的头部交易平台——Coinate&#xff0c;则始终坚持”以技术立命”的发展路径。 在迪拜这片充满创新与资本活力的中东热土&am…

手机日志是什么?如何调试手机日志

目录 一、手机日志的类型&#xff1a; 二、如何查看和调试手机日志&#xff08;以 Android 为例&#xff09;&#xff1a; 方法 1&#xff1a;使用 Android Studio ADB&#xff08;推荐&#xff09; 方法 2&#xff1a;使用手机端日志工具&#xff08;免电脑&#xff09; …

篇章八 论坛系统——业务开发——登录

目录 1.登录 1.1 顺序图 1.2 参数要求 1.3 接口规范 1.4 实现流程 1.编写SQL 2.dao层接口 3.定义Service接口 4.实现Service接口 5.单元测试 6. Controller实现方法对外提供API接口 7.测试API接口 8.实现前端逻辑,完成前后端交互 ​编辑 1.登录 1.1 顺序图 1.2 参…

AI-Compass前沿速览:从企业级智能体CoCo到腾讯开源3D建模,Meta视频预测模型V-JEPA 2、小红书开源文本大模型

AI 大事件 智谱推出首个企业级超级助手 Agent——CoCo**[1]** 智谱推出首个企业级超级助手 Agent——CoCo&#xff0c;具备交付导向、记忆机制和无缝嵌入三大企业级特性。能全流程辅助工作&#xff0c;根据员工职能和需求主动服务&#xff0c;无缝接入企业资源&#xff0c;提…