這一節我們一起看下工作中常常使用的除錯技巧。除錯是軟體開發過程中必不可少的環節,對於嵌入式開發者來講很多任務作都是體現在除錯上,有句話講「程式不是寫出來的,好程式是調出來的」,一點都不誇張。
縱觀來看除錯可以分為硬體斷點除錯和軟體斷點除錯。
硬體除錯需要 cpu 的支援,cpu 內部提供了兩組暫存器用來儲存設定的斷點,但是這種場景決定於內部硬體設計與偵錯程式和其他除錯工具無關。
本 chat 主要講軟體層面的除錯,也是開發者工作中最常用到的除錯方法。
談到軟體,無疑其決定因素是作業系統,這裡我們以 linux 作業系統為例對核心態,使用者態以及其除錯工具和除錯方法進行剖析。
用 gdb 除錯核心的話首先需要核心支援 kgdb,配置如下:
配置成功後編譯核心,然後修改 uboot 啟動引數以支援 kgdb 除錯:
setenv bootargs 'console=ttys0,115200n8 kgdboc=ttys0,115200 kgdbwait …… nfsroot=……'
由 uboot 啟動,等到 kgdb 的位置時停下等待 gdb 的連線,如圖:
然後用 gdb 除錯 vmlinux(注意此時是交叉編譯器的 gdb):
$arm-none-linux-gnueabi-gdb vmlinux
順利的話顯示如下:
接下來就和除錯應用程式一樣除錯核心了。
除了單步除錯外還有一種場景是我們經常碰到的,在系統執行中 linux 核心發生崩潰的時候。
這時候可以通過 kdump 方式收集核心崩潰前的記憶體,生成 vmcore 檔案,通過 vmcore 檔案診斷出核心崩潰的原因。
其中 kexec 是實現 kdump 機制的關鍵,它由兩部分組成:
一是核心空間的系統呼叫 kexec_load,
負責在生產核心(production kernel 或 first kernel)啟動時將捕獲核心(capture kernel 或 sencond kernel)載入到指定位址
二是使用者空間的工具 kexec-tools
將捕獲核心的位址傳遞給生產核心,從而在系統崩潰的時候能夠找到捕獲核心的位址並執行。
沒有 kexec 就沒有 kdump。
先有 kexec 實現了在乙個核心中可以啟動另乙個核心,才讓 kdump 有了用武之地。
下面附一張 kdump 的實現原理,感興趣的小夥伴可以進一步研究,這部分不是本 chat 重點,下面讓我們具體講下如何使用 kdump。
經常用到分析 vmcore 的工具就是 crash,掌握 crash 的技巧對於定位問題有著很重要的意義。
配置 kdump 完成後當系統崩潰的時候在 /var/crash/ 當天日期/生成乙個 vmcore 檔案
下面就可以對 vmcore 檔案進行分析。
crash vmlinuz-4.2.0-27-generic vmcore進入 crashcrash>
進入 crash 環境後就可以運用 crash 命令進行除錯,比如 b
技術難點 Spark效能調優 RDD運算元調優篇
不廢話,直接進入正題!1.rdd復用 在對rdd進行運算元時,要避免相同的運算元和計算邏輯之下對rdd進行重複的計算,如下圖所示 對上圖中的rdd計算架構進行修改,得到如下圖所示的優化結果 2.盡早filter 獲取到初始rdd後,應該考慮盡早地過濾掉不需要的資料,進而減少對記憶體的占用,從而提公升...
linux 核心調優
設定linux核心引數 配置 linux 核心引數 2種方法 修改後不用重啟動更新 sbin sysctl p 第一種 開啟 etc sysctl.conf 複製如下內容 kernel.shmall 2097152 kernel.shmmax 2147483648 kernel.shmmni 409...
Linux核心調優
專案出現socket連線超時和管道斷開連線 檢查nginx,nginx報錯 recv failed 104 connection reset by peer while reading response header from upstrea錯誤日誌表示 1 伺服器的併發連線數超過了其承載量,伺服器...