2025年6月25日 星期三

core dump 以及透過 gdb 來debug,問題點出在哪

 今天我們拿 systemd-journald 的 core dump 來當範例
 解壓縮 core_systemd-journald.tar 可以看到資料夾內有以下檔案


我們這篇,主要是去拿 exe.lz4 與 core.lz4 來放到 gdb 裡面,來做debug

所以我們先把者兩個 lz4 檔案,放到linux 系統中使用以下 command 把他解開,得到兩個檔案,分別是 core 與 exe,
core 是 core dump 紀錄的錯誤資訊,exe 則是此執行檔(systemd-journald)
=>
lz4 -d core.lz4 core
lz4 -d exe.lz4 exe

接著我們把 core 與 exe 丟到有gdb 的 device上,如果編譯的時候,也有編譯出 symbol 的 library 或是 執行檔,也可以準備一下,等等 gdb 會使用到 (symbol 就是沒有被 strip 的檔案)
symbol資料夾如下:


接著到平台上,執行 gdb,command 如下:
=>
gdb exe core


可以看到Core was generated by `/lib/systemd/systemd-journald'.
Program terminated with signal SIGABRT, Aborted.
=> systemd-journald 因為 SIGABRT造成的 crash

接著可以用 bt full 印出完整的資訊

目前只能知道,在 libc.so.6 這個 library的 function,writev() 出了問題,下面指出
No symbol table info available
我們就去找 symbol folder,試試看用 systemd-journald 的 binary跑gdb 試試看


gdb systemd-journald core
會看到多了一些資訊,gdb似乎有載入一些資訊


此時,在重新執行剛剛的指令,可以看到更完整的資訊
=>
gdb exe core
  








2025年6月20日 星期五

指令,把read-only 的filesystem,remount 成 read/write

使用mount指令,先看一下,目前 / 掛載為 read-only,ext4 的 filesystem
root@:# mount
/dev/mmcblk0p16 on / type ext4 (ro,relatime,norecovery)


把 root folder 重新掛載成可 read/write
 mount -o remount,rw /

再用mount看一次
root@:~# mount
/dev/mmcblk0p16 on / type ext4 (rw,relatime,norecovery)

2025年3月7日 星期五

馬桶水箱的水一 直滿出來,解決方法

 家裡馬桶水箱的水,一直太滿,從水箱中的一根管子溢出
 因為馬桶水箱,是靠浮球浮起來,來止水灌進水箱的

這裡提供兩個簡易的解決方法,可以先試試看能不能解決

1. 檢查浮球是否進水,導致浮不起來,
=> 有的浮球是可以轉開來的,可以看看裡面是否有進水
     把水甩掉,或是弄掉,再試試

2. 把連接浮球的鐵桿,弄彎一點,看看能不能止水

2025年1月7日 星期二

Linux Tool, taskset 可以用來限制程式,只去使用特定 CPU

 Linux 當中有個Tool,叫做 taskset,可以限制某個Daemon只跑在規定的CPU編號之下,這邊會先簡單介紹 taskset使用方式,不免俗的,最後會附上一個實際操作

首先簡單寫一個 while迴圈,打印test的字樣,但不顯示在螢幕上,這支來當我們的Daemon,並且使用以下command,讓他在背景執行
=> sh loop_test.sh &
======= loop_test.sh 小程式 =========
#!/bin/sh
while [ 1 ]
do
   echo "test" > /dev/null
done



======= 使用方式 =======

首先我們可以用以下的指令,來得知目前設備的 CPU核心數目
=> cat /proc/cpuinfo

查詢目前的 Daemon,所配置的 CPU編號,這有兩種查詢方式
1. 直接列出,此Daemon使用的CPU編號,這邊Daemon的 PID=5622 (ps -aux | grep loop_test.sh)
=>
root:~# taskset -cp 5622
pid 5622's current affinity list: 0,1

2. 以mask方式列出,此Daemon使用的CPU編號,這邊Daemon的 PID=5622
=>
root:~# taskset -p 5622
pid 5622's current affinity mask: 3

這邊的3,為Hex,需要把他換成二進制來解讀,所以為 0x11,表示CPU0,CPU1目前會讓此Daemon使用(如果CPU為8 core,得到的數值為FF(hex),則表示 CPU0~7都會分配)


======= 使用方式 & 實驗 =======
設置目前的 Daemon,只分配CPU1 來做

=>
root:~# taskset -cp 1 5622
pid 5622's current affinity list: 0,1
pid 5622's new affinity list: 1

"top -d 1" 觀察一下cpu 與 process 狀態

=> 可以看到 CPU1 的 idle為0%,loop_test.sh 把整個CPU1用盡了,而CPU0是完全閒置的











這時候,我們再使用指令把 loop_test.sh 平均分配給 CPU0 & CPU1
=>
root@auto2735evb-ivt-vp2:~# taskset -cp 0,1 5622
pid 5622's current affinity list: 1
pid 5622's new affinity list: 0,1

"top -d 1" 觀察一下cpu 與 process 狀態
=> 可以看到 CPU0與CPU1,都有分配給 loop_test.sh使用



2024年12月6日 星期五

在adb shell 執行一個背景程式,如何讓 adb shell中斷後,此背景程式不會被中斷

 今天遇到有客人問一個問題
 他想要用 tcpdump 抓封包,指令如下:
tcpdump -i any -C 100 -W 10 -U -w /tmp/tcpdump.cap &

但因為,我們的device,在拔除usb之後,device可以進入 suspend
他想要在 wakeup的時候,抓到是甚麼樣的封包,

另外他想要透過 adb shell 去執行這個指令,所以當下完上面指令,adb shell 斷線之後
tcpdump 也終止了

查詢與嘗試了一下,可以使用以下指令解決
nohup tcpdump -i any -C 100 -W 10 -U -w /tmp/tcpdump.cap > /tmp/tcpdump.log 2>&1 &

只要確保 /tmp 目錄是可寫的,這樣 tcpdump 的輸出和錯誤信息將被寫入到 /tmp/tcpdump.log 文件中


2021年11月22日 星期一

Yocto Project 如何編譯出 ToolChain,如何使用 Toolchain編譯

 Yocto 目前已經是各大IC廠在使用的專案類型,與之相似的,有OpenWRT 或是 BuildRoot

今天要介紹如何從Yocto Project 編譯出ToolChain,並且會說明如何使用ToolChain,最後會說明如何編譯一個簡單的Hello World.

如何編譯出ToolChain
首先我們可以使用以下的Command來編譯出 ToolChain
bitbake meta-toolchain

編譯完成後,在 build/tmp/deploy/ 資料夾底下,會多出 sdk 資料夾,而裡面會有 ToolChain安裝檔,如下圖:








如何安裝ToolChain

把上面編譯出來的ToolChain安裝檔,執行並且加上參數 -h ,可以看到此安裝檔的使用說明,如下所示:

./oecore-x86_64-aarch64-toolchain-nodistro.0.sh -h
Usage: oecore-x86_64-aarch64-toolchain-nodistro.0.sh [-y] [-d <dir>]
  -y         Automatic yes to all prompts
  -d <dir>   Install the SDK to <dir>
======== Extensible SDK only options ============
  -n         Do not prepare the build system
  -p         Publish mode (implies -n)
======== Advanced DEBUGGING ONLY OPTIONS ========
  -S         Save relocation scripts
  -R         Do not relocate executables
  -D         use set -x to see what is going on
  -l         list files that will be extracted

如果沒有使用 "-d" 來指定安裝路徑,則系統預設會安裝在 /usr/local/oecore-x86_64/
簡單的安裝指令如下,會把ToolChain安裝在 /opt/ 路徑下:
./oecore-x86_64-aarch64-toolchain-nodistro.0.sh -d /opt/

可以看到 /opt/ 底下有一些檔案,有一些是環境變數設定檔,而ToolChain都在 sysroot資料夾底下

如何編譯可以放在開發版上的 HelloWorld 程式
假設剛剛我們把ToolChain安裝在 /opt/ 底下,我們可以先使用下面指令來設定一些環境變數
source /opt/environment-setup-aarch64-poky-linux

環境變數設定好之後,變數 $CC 會是預設的ToolChain執行檔,印出 $CC 這個變數,可以看到如下圖片:




接著先撰寫好簡單的helloWorld.c 小程式,用下面的Command編譯,就可以編譯出開發板可以Run的小程式
# 
$CC helloWorld.c -o hello


由這邊也可以發現,當要自己加入Package 到 Yocto Project,通常這個Package的 Makefile裡面,不能指定CC的值,不然編譯會出問題,關於這個議題,我再開一篇文章來講解如何加一個Package到 Yocto Project...

2021年9月27日 星期一

vi / vim 常用的搜尋方法

以下方式都是在command 模式,(按小寫i 就會切換到編輯模式,在按一次ESC會切到command模式)

1. 將游標移到字串上,直接按"*" ,可以直接做向下搜尋

2. 輸入"/", 接著輸入字串,可以向下搜尋此字串,接著按"n",可以向下搜尋,按"N",可以向上搜尋

3. 按下"?", 接著輸入字串,可以向上搜尋字串,接著按"n",可以向上搜尋,按"N",可以向下搜尋

4. 按下":",輸入"set num",可以列出整篇文字檔的"行號"