esp8266/esp32 利用addr2line工具定位系統崩潰

2020-09-13 嵌入式筆記v

引言

不管在PC端還是在嵌入式設備中,代碼執行過程中運行出錯,如棧溢出,引用野指針,重複free同一塊內存等等,都是件非常可怕的事情。好在PC端作業系統會幫我們終止相關進程,並回收其資源,不至於導致整個作業系統崩潰。 而嵌入式設備就比較慘了,往往會導致系統宕機,直接重啟,很大程度影響了我們產品的可靠性。 同時隨著工程代碼越來越龐大, 出現宕機的原因也難以具體分析出到底是哪一行導致的系統崩潰。今天我們就來介紹一個神器,即如何使用addr2line命令來跟蹤代碼運行出錯時,具體是哪行代碼導致的,以幫助我們定位問題所在。

addr2line是什麼東東

addr2line 工具(它是標準的 GNU Binutils 中的一部分)是一個可以將指令的地址和可執行映像轉換成文件名、函數名和原始碼行數的工具。通俗來講就是可以根據宕機時PC(程序計數器)的值來轉化為具體執行了哪個文件下的函數中的代碼(行號)。這裡說的是esp8266和esp32採用xtensa交叉編譯工具鏈,集成了Binutils中的工具集,如addr2line, ar,as,ld等等。它們分別在xtensa-lx106-elf\bin(esp8266),xtensa-esp32-elf\bin(esp32)目錄中。

在linux中使用addr2line工具

既然知道了addr2line是GNU Binutils中的一個工具,那麼我們就先在linux中嘗嘗鮮,看看addr2line是如何使用的吧。 這裡我們簡單編寫一個簡單的例子:定義一個int *指針,並初始化為NULL, 然後解引用,即賦值為0,具體如下:

//測試源文件test.c39;ed (StoreProhibited). Exception was unhandled

其中StoreProhibited 粗略的告知我們是關於存儲錯誤導致的,並列印了系統崩潰時,一些寄存器的值,而我們最關心的就是當前PC(程序計數器)的值, 上圖中PC的值顯示: 0x400e4235, 以及下方

Backtrace: 0x400e4235:0x3ffb4cf0 (這裡需要說明的是esp8266和esp32是雙核cpu,因此有2個PC程序計數器), 這裡我們根據提示是核心core0崩潰的,對應的PC就是0x400e4235。OK,接下來我們就利用addr2line來定位出問題的代碼:

首先我們cd到編譯生成的buile文件夾中:

然後輸入命令:

xtensa-esp32-elf-addr2line -e project-DD7002B.elf 0x400e4235

Enter回車:

可以看到輸出顯示出問題的代碼所在的詳細路徑 和 行號,即在Test_Hub.c的第55行代碼導致的系統崩潰,之後大家就可以以此為突破口來分析問題了。

總結

addr2line工具雖然能夠幫助我們定位問題代碼的路徑和行號,但是不是所有的環境都支持該功能,因此大家在實際開發過程應當有自我意識,自己所寫的每一行代碼做到心中有數,尤其是在內存,指針等操作。 這就離不開平時的不斷學習,提高自己的編程能力。


相關焦點

  • esp8266/esp32基於RTOS_SDK(idf框架)製作自己的靜態庫
    引言 前段時間因公司內部業務調整,需要將自己的手頭上的有關esp8266和esp32的相關項目移交出去,為了保護核心代碼,應領導要求需將一些核心的代碼打包成靜態庫(有關靜態庫和動態庫的概念,我在之前的文章中都有介紹,以及如何在linux和
  • 嘗試在Win10系統搭建esp32編譯系統.下
    要將舊版本的預編譯環境中的數據移動到新版本:把舊的 MSYS2 環境(即 C:\msys32)移動/重命名為不同的目錄(即 C:\msys32_old)。按照前文所述步驟下載新的預編譯環境。將新的 MSYS2 環境解壓縮到 C:\msys32 (或其他位置)。找到舊的 C:\msys32_old\home 目錄並把它移到 C:\msys32。
  • ESP8266 Wi-Fi到底傳多遠_esp8266 wifi信號強度測距
    esp8266介紹   esp8266是一個具有WiFi功能的開發板,它是由一家名為樂鑫的科技公司所設計,在由安信可科技公司負責生產,在以前要買到具有WiFi功能的開發板都要上千元,esp8266打破了這個價錢,一個只需要65元左右,65元的開發板功能應有盡有,不輸上百元的開發板,因此esp8266很受開發連網相關應用的開發者的喜愛。
  • esp32和stm32哪個好_ESP32對比ESP8266
    esp32和stm32哪個好_ESP32對比ESP8266 單片機愛好者 發表於 2020-04-23 11:06:19   esp32和stm32哪個好
  • arduino-esp8266開發環境配置記錄
    網上購買了esp8266的迷你開發板,自帶串口燒錄(CH340G晶片),先上圖:.readthedocs(英文開發手冊):中文官方文檔:用Arduino工具開發:從 Arduino 官網 下載最新版本Arduino IDE 軟體並安裝(我的環境版本:Arduino 1.8.12)。
  • stm32通過spi連接esp8266的hspi 開發
    2,esp8266端的驅動如何開發?3,esp 8266 hspi 的雙線協議代碼如何實現?4,tcp 數據轉spi , spi數據轉tcp數據,數據如何分片重組,一集如何提高性能。(SPI2,SPI_I2S_FLAG_RXNE)==RESET); return SPI_I2S_ReceiveData(SPI2); //緊接著再接收一個byte的數據}        參考esp8266的技術手冊,我們知道esp8266的hspi協議是需要有命令和地址的,所以我們再做一次封裝,把命令和地址也封裝在裡邊。
  • Windows 搭建ESP32 ESP-IDF開發環境(VSCode)
    >開發環境的搭建VS Code安裝百度vscode進官網下載安裝,完成後安裝git插件Git安裝安裝完成後就可以在vscode中選擇git做為終端從Github上獲取ESP-IDF一定要注意recursive選項,因為esp32
  • ESP8266 NodeMCU型號指南
    那我們今天就來一一解答吧~官方「標準版」esp8255 NodeMCU開發板,採用cp2102串口晶片>本人購買的幾種開發板,從左至右分別為:ch340g版esp8266,cp2102版esp8266,和esp32。
  • esp32-wroom模塊如何使用
    一.概述:esp32-wroom模塊可以提供wifi,藍牙等功能.本次測試主要使用WiFi功能進行數據的透傳,也是很多項目中經常用到的功能.大體思路是esp模塊設置為station模式(也就是作為一個終端設備,如pc),在該模式下連接到現有路由器網絡.這時路由器網絡中的設備之間便可以通過網絡進行數據的交換,也就是說esp32模塊具有了和其他設備通訊的橋梁.
  • 微信小程序遠程控制esp8266的RGB三色燈項目
    然後進行首選配網方式引導頁配置,使用默認即可,點擊保存2.It is assumed the directory this Makefile resides in is aPROJECT_NAME := esp8266-qcloud-iotIDF_DIR := ESP8266_RTOS_SDKPWD := /home/Administratorexport IDF_PATH ?
  • 物聯網模塊ESP8266燒寫指南
    上篇文章我們講了搭建esp8266的開發環境,並且把demo的軟體已經編譯出來了,我們需要把編譯的這個二進位固件燒寫到ESP8266晶片裡面才能運行。晶片的官網提供了燒寫軟體,是windows版本的,官方最新的是flash_download_tools_v3.6.4.rar,打開如下圖所示,點擊esp8266 Downloadtool按鈕。
  • WiFI模塊開發教程之ESP8266基礎篇1:Alios-Things 3.0環境搭建
    一、基礎知識1.esp8266簡介ESP8266EX 內置超低功耗Tensilica L106 32 位 RISC 處理器,CPU 時鐘速度最高可達 160 MHz,支持實時作業系統(RTOS) 和 Wi-Fi 協議棧,可將高達
  • 物聯網WIFI模塊ESP系列開發板固件常見的2種下載方式
    ESP32與ESP8266簡介ESP8266接口視圖ESP32功能框圖基於arduino ide的ESP32/ESP8266開發環境搭建基於arduino ide的ESP32/ESP8266開發環境燒錄固件
  • 用Arduino玩轉掌控板(ESP32):ESP32概述與Arduino軟體準備
    本教程主要採用了**掌控板**、DFRobot 出品的 **FireBeetle-ESP32**、安信可出品的 **NodeMCU-32S** 這 3 塊學習板進行展開。其中掌控板是我們學習的主要器件,而 FireBeetle-ESP32、NodeMCU-32S 這 2 塊板子,主要以配合講解為主,方便讓大家知道背後的原理。
  • VScode中集成esp8266/32開發環境詳解
    引言 文章的起點源於一個小夥伴私信我,想了解如何在vscode中直接開發esp8266。vscode其輕便,小巧等優點越來越受各類程式設計師的喜愛。/32(之後以esp8266為例子)開發環境,包括下載ESP8266_RTOS_SDK, 交叉工具鏈,msys32等,並設置IDF_PATH,PATH 環境變量,這裡不再贅述,不熟悉的小夥伴請參考我之前的視頻。
  • 用ESP8266製作復古遊戲機
    _arduboy2/src/Arduboy2.cpp #line 16SSD1306Brzo oled(0x3c, D2, D1); // OLED_I2C_ADRESS, I2C_SDA, I2C_SCL)修改按鍵對應地址// esp8266_arduboy2
  • ESP32在ubuntu下的開發環境的搭建
    1 安裝基礎工具sudo apt-get install gcc git wget make libncurses-dev flex bison gperf python python-pip python-setuptools python-serial python-cryptography python-future2. 下載編譯鏈工具3.解壓4.
  • ESP32-CAM+PIR傳感器=動作抓拍監控
    實驗所需材料    ESP32-CAM開發板帶OV2640攝像頭MicroSD存儲卡PIR傳感器2N3904 NPN型三極體FTDI USB轉串口下載器母對母杜邦跳線5V電源(可以用改造後的充電寶
  • pyserial串口讀取esp32-cam攝像頭
    講解過程視頻訪問網址:https://www.ixigua.com/6864818246109889036/esp32-cam的引腳連接表:直接上代碼:1、esp32-cam(arduino下位機代碼)34;esp_camera.h&34;Camera init failed with error 0x%x