kicad運行時出錯,_Pnext->_Myproxy = nullptr;訪問內存出錯

花費了比較長的時間,解決了編譯過程中遇到的許多問題后,終于把這個開源的工程編譯好了,運行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;提…