1. 程式人生 > >【ESP8266】關於除錯fatal exception/自動重啟的一些經驗分享

【ESP8266】關於除錯fatal exception/自動重啟的一些經驗分享

本人小白一枚

最近在搗鼓ESP8266的NONOS_SDK開發,本來已經寫好了一個工程測試基本功能也沒什麼問題了,但是發現了一個很嚴重的問題,就是每次一跑上40來分鐘的時候,就會宕機重啟,自動重啟,真是奇了個怪了,本來這也沒啥,但出於對穩定性的追求還是決定把這bug給補上。

一、問題復現

首先還是要確定,是不是就是同一個問題導致的宕機。每次都要等上40分鐘還是挺痛苦的。

基本上能確定每次都是這裡導致的宕機


二、找對應程式碼錯誤點

最奇怪的就是,網上的fatal exception基本上都會有像這樣子的

Fatalexception 29(StoreProhibitedCause):
epc1=0x4000df64, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000


然而我的卻沒有……這bug不按常理出牌啊

順便說一下通常的情況,像上述的fatal exception 我們是可以找到錯誤地址的,方法如下:

在 (*.S) 檔案中找出對應的地址,新增列印以便定位問題。

Fatal exception 29(StoreProhibitedCause):

epc1=0x4000df64, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000000, depc=0x00000000

比如使用的是 user1.bin,那麼就在 user1.S 中找到0x4000df64 地址,並查明對應的函式。

如果使用的是 flash.bin + irom0text.bin,可以在 eagle.S 中查找出錯的地址。

雖然我們也未必能看得懂彙編,但是我們可以在附近找一找有沒有類似函式名的標籤從而定位程式碼的位置。

比方說


這個我們就能猜到可能是uart0_rx_intrx_handler的程式碼出了問題。

言歸正傳,現在這條尋常的思路斷了,我們就只能不斷通過輸出資訊來除錯了,通過多次重現問題,發現每次在建立TCP連線時宕機的。

這就奇怪了,因為這程式碼我是抄的啊!2333333
於是只能仔細讀讀這段程式碼了,反覆讀反覆測,然後終於發現
/*
 * 函式名:	iot_station_init
 * 描述:		以ESP8266為客戶端,建立tcp連線
 * 輸入:		remote_ip:伺服器IP
 * 			local_ip:本地IP
 * 			remote_port:伺服器埠
 * 返回:		true:成功
 * 呼叫:		無
 */
bool ICACHE_FLASH_ATTR iot_station_init(struct ip_addr *remote_ip ,struct ip_addr *local_ip ,int remote_port )
{
#ifdef DEBUG
	os_printf("\r\ncall iot_station_init\n");
#endif
	os_printf("\r\n3");
	user_tcp_conn.type = ESPCONN_TCP;
	user_tcp_conn.state = ESPCONN_NONE;

	user_tcp_conn.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));
	//
	os_printf("\r\nuser_tcp_conn.proto.tcp: %X", user_tcp_conn.proto.tcp);
	os_memcpy(user_tcp_conn.proto.tcp->local_ip ,local_ip,4);
	os_memcpy(user_tcp_conn.proto.tcp->remote_ip ,remote_ip,4);
	user_tcp_conn.proto.tcp->local_port = espconn_port();
	user_tcp_conn.proto.tcp->remote_port = remote_port;
	os_printf("\r\n4");
	espconn_regist_connectcb(&user_tcp_conn ,user_tcp_connect_cb);
    espconn_regist_reconcb(&user_tcp_conn ,user_tcp_recon_cb);
#ifdef DEBUG
	os_printf("\nespconn_connect");
#endif
	espconn_connect(&user_tcp_conn);
	//os_free(user_tcp_conn.proto.tcp);
	//os_printf("\r\nfree: %X", user_tcp_conn.proto.tcp);
	os_printf("\r\n5");
	return true;
}

這裡每次都在申請堆空間,儲存tcp設定項user_tcp_conn.proto.tcp,然而卻重來沒有釋放。
所以按道理來說應該是會堆空間溢位的,再測試一遍,確實如此。 後來我又看了很多別人的例程,這個問題也是會存在的額。
最後返回NULL了估計,那當然錯啊!(誰寫的例程!?!?) 三、修bug 本想著,這還不給我找到你?你沒釋放記憶體是吧?我幫你釋放就好了,然而結果才是讓我始料未及的
這回,一開始就宕機,以前還能撐個40分鐘,現在,一開機就重啟……若是大俠看到了,請告訴我是不是我的os_free用的不對,程式我註釋了。 但是人家給出也這麼用?
既然這樣,我就直接連申請空間也不要了,直接固定空間讓你用,是不是很蠢?233333 不管了,反正它現在很乖。 參考資料: http://home.eeworld.com.cn/my/space-uid-361439-blogid-337387.html
http://blog.csdn.net/chen244798611/article/details/52762145
2c-esp8266_non_os_sdk_api_reference_cn.pdf

相關推薦

ESP8266關於除錯fatal exception/自動一些經驗分享

本人小白一枚 最近在搗鼓ESP8266的NONOS_SDK開發,本來已經寫好了一個工程測試基本功能也沒什麼問題了,但是發現了一個很嚴重的問題,就是每次一跑上40來分鐘的時候,就會宕機重啟,自動重啟,真是奇了個怪了,本來這也沒啥,但出於對穩定性的追求還是決定把這bug給補上。

JMeterHTTP請求:自動定向和跟隨定向

【Jmeter】HTTP請求:自動重定向和跟隨重定向 自動重定向 跟隨重定向 在JMeter中的設定 自動重定向 HttpClient接收到請求後,如果請求中包含重定向請求,HttpClient是可以自動跳轉的,但是隻針對Get與H

shell監控網站是否自動運行並自動原創

自動重啟 aid func 服務腳本 date null com 監控網頁 moni shell監控網站是否自動運行並自動重啟 #!/bin/bash wget --spider -q -o /dev/null --tries=1 -T 5 www.baidu.co

解決eclipse修改後臺代碼ctrl+s總是自動服務器問題

action ctrl+s mage deb ima nbsp 修改 debug lips 每次修改後臺代碼保存總是自啟動服務很是耗時,以下設置可以解決你的煩惱: 雙擊你要設置的項目; 點擊ok,最後ctrl+s一下就搞定了。 這時候你隨便修改後臺代碼隨便ctrl+s

HP-Socket沉思錄在 OnClose 中自動

HP-Socket 版本 5.3.2   其實這裡是取了個巧,因為並不是真正意義上的在 OnClose 中。由於同一個連線的事件是序列的,所以 OnClose 事件不完成 socket 的狀態始終懸置。 可以在 OnClose 中

tomcat宕機自動和每日定時啟動tomcat工具包系列

在專案後期維護中會遇到這樣的情況,tomcat在記憶體溢位的時候就出現宕機的情況和遇到長時間不響應,需要人工手動關閉和重啟服務,針對這樣的突發情況,希望程式能自動處理問題而不需要人工關於,所以才有了目前的需求。 一、設定tomcat定時啟動 1,首先將tomcat註

ESP8266ESP8266通訊使用的AT指令

可用 本地ip border station 查詢參數 pcl 內部 執行 通訊 一、AT指令介紹   AT(Attention), AT指令一般應用於終端設備和PC應用之間建立連接。通過AT指令來控制。 二、常用AT指令   AT指令主要分為: 基礎AT指令,WIFI功能

ActiveMQ消息生產者自動註入報錯:Could not autowire. No beans of 'JmsMessagingTemplate' type found

註入 fin producer 定義 red because spl send code 使用ActiveMQ過程中,定義消息生產者: package com.sxd.jms.producer; import org.springframework.beans.fa

tomcatjava.lang.Exception: Socket bind failed: [730013] ???????????????í????×??????·??????×?

【問題描述】          今天啟動tomcat的時候發生瞭如下的報錯: java.lang.Exception: Socket bind failed: [730013] ???????????????í????×??????·??

原創聊天機器人與自動問答技術

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

vue除錯

一、外掛使用   安裝谷歌外掛 vue.js devtools 在谷歌外掛中心安裝,在vue介面點選右鍵,選擇檢查 使用的時候,在上邊工具欄找到vue,選中     二、執行時除錯   在程式碼視窗加入debugger關

Flask增加使用者體驗之 定向redirect和反向解析url_for

本篇部落格討論的redirect和url_for,均在Flask環境下。 上一篇部落格☜,我們自定義了錯誤資訊(頁面),但是這樣使用者體驗也是不夠友好的,因為一個簡單崩潰的頁面就很可能易造成使用者的流失,所以我們需要繼續提升使用者體驗。 舉個例子:現在雙十一活動結束了,但一

zabbixzabbix忘記密碼,置密碼

忘記密碼這種事經常會發生,這裡我們介紹一種zabbix忘記使用者密碼的處理方式。 原理:     zabbix儲存在資料庫中使用者名稱密碼是經過32位,小寫,md5加密過的。我們可以手動修改資料庫中使用者的密碼。 實踐:     1,連線資料庫:  

Linux製作kickstart指令碼自動安裝linux系統

摘要:之前我們介紹了圖形介面安裝虛擬機器,這樣不適合批量操作。後來我們又介紹了指令碼安裝虛擬機器,但是也只能算是半自動安裝吧,後面依舊有很多步驟與圖形介面安裝一致。所以這次我們來介紹真正的一勞永逸,如何製作kickstart指令碼自動安裝虛擬機器。 1. kickstart簡介 ki

PythonPython中list去的幾種方法

目錄 方法一: 方法二: 方法三: 方法四: 方法一: 直接使用set def set_duplicate_removal(): lis = [1, 2, 2, 3, 7, 7, 9, 9, 10, 10] lis = set(lis) p

HTML5解決視屏自動播放的vedio標籤設定

<video muted controls = "controls" autoplay = "autoplay" width = "800" height = "600"> <source src="testing.mp4" type = "video/mp4"/>

IIS應用程式池自動回收問題

IIS可以設定定時自動回收,預設回收是1740分鐘,也就是29小時。IIS自動回收相當於伺服器IIS重啟,應用程式池記憶體清空,所有資料被清除,相當於IIS重啟,在度量快速開發平臺伺服器端,為了減小資料庫負擔,記憶體中暫存了很多資訊,不適合頻繁的回收,因為回收會造成伺服器

C++過載、重寫和定義的區別

一、過載(overload) 指函式名相同,但是它的引數表列個數或順序,型別不同。但是不能靠返回型別來判斷。 (1)相同的範圍(在同一個作用域中) ; (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 (5)返回值可以不同; 二、重寫(也稱為覆

JSPJSP頁面使用sendRedirect定向到另一個JSP頁面時如何傳參

response.sendRedirect ( ) 方法可以用來重定向一個URL,如果我們想要傳遞引數的話,可以使用 get 方法,在 URL 中新增引數。 例如,我們要重定向到登入成功頁面,需要傳遞的引數是登入 id。那我們可以這麼來使用 sendRedirect(): respons

總結Throwable/Error/Exception/RuntimeException區別

【總結】Throwable/Error/Exception/RuntimeException區別 1.JAVA是將所有的錯誤封裝為一個物件,其根本父類為Throwable,有兩個子類:Error和Exception。 2.Error是Throwable 的子