Wednesday, September 30, 2015

GDB 的流水帳


Usage:
        armgdb is running on x86 as a client.
        gdbserver is running on arm-device as a server.

        Ex.
                ===================
                == On the device ==
                ===================
                        #./gdbserver 127.0.0.1:1234 server &
                Then gdbserver will listen on port 1234 on the device


                ================================
                == On the x86 (vmware fedora) ==
                ================================
                        #cd
                        #./armgdb server

                Then the gdb prompt will appear and waiting your command...
                Some settings need to be set first
                        (gdb) set solib-search-path /project/target/fs-cpio/lib <== path to your rootfs lib directory

                Then let's connect to the device port 1234
                        (gdb) target remote :1234
                        [Optional : (gdb) break ]
                        (gdb) run

Book : GNU - Debugging with gdb


用 gdb 對特定記憶體區域寫入設斷點



加快編譯的一些取巧方式


GDB 7.9 可以動態編譯插入程式片段進入正在跑的程式中
沒試過 ... 歡迎不怕辛苦的嘗試看看






這本書(Debug Hacks)讓我想起 stack unwinding oprofile

一些連結,主要是針對 ARM 架構如何去做 stack unwinding , 我目前是土法煉鋼在 SIGSEGV handler 內把該 thread  stack 直接 fopen 寫到一個檔案,因為 core dump 不完整磁碟空間不足,所以只好針對性的 dump stack. 

·         Memory Debugging
use address sanitizer, Linaro ported it to ARM on 2013/07
·         Backtrace on SEGFAULT
·         socketpair(2): create two already connected unix domain sockets
·         libunwind from Wiki:Call Stack

以下是我的一些 googling ,我後來有加程式碼來 dump stack 以及用 addr2line 來亂槍打鳥尋找可能的 backtrace .

1.    man 5 core, from linux 2.6.19 it supports piping core dump to another process
Ref : Piping core dumps to a program
2.    GDB Document
3.    Get EIP in SIGSEGV action handler
Need to add -rdynamic
Ref toolchain /sys/ucontext.h for the third argument of signal action handelr.
4.    libbacktrace
A library could be linked to your program can called to analysis DWARF stylf executable.
 .        對岸的backtrace()
Create a global array to record every pthread’s first variable pointer (As stack bottom),
ex:
oprofile 

perf Profiler

Examine cache miss and branch prediction miss events for performance tuning
Perf tutorial, examples
On older kernels, use oProfile as a perf replacement
Good branch prediction miss example: Stackoverflow: Why is processing a sorted array faster than an unsorted array?
https://wiki.linaro.org/KenWerner/Sandbox/perf: perf and Cortex A9

Performance Monitor Unit

ARMv7 common PMU events are in the ARMv7 AR

一些關鍵字
oprofile
strack
valgrind
kprobes
backtrace
vfs_cache_pressure
kswapd
watchpoint
sigsegv
netconsole
oops
syslogs
ptrace
systemtap
meminfo
proc
oom killer
slab
oprofile
vprobe
xen
nmi
objdump
scheduler
stack overflow
semaphore
deadlock
buffer overrun
kernel mode
race condition
interrupt


gdb: running on PC
gdbserver: running on the device

If you have problem to run them, you may uncompress the gdb.tar.bz2 to re-build again.
(cat config.log or config.status to search for pattern like “./configure …..”, then
 copy-paste on to re-build again)

Device:
        iptables -P INPUT ACCEPT
        ./gdbserver --attach 0.0.0.0:3000 &

PC:
        ./gdb
        (gdb) set solib-search-path
        (gdb) target remote 172.16.3.92:3000
Remote debugging using 172.16.3.92:3000
[New Thread 237]
(gdb) bt
#0  0x401cb218 in select () from /usr/src/trunk/target/fs-cpio/lib/libc.so.0
#1  0x0000b6c0 in event_loop (single=
During symbol reading, incomplete CFI data; unspecified registers (e.g., r0) at 0xb278.
0) at event.c:481
#2  0x00020300 in main (argc=1, argv=0xbed11eb4) at server.c:287
(gdb) n
Single stepping until exit from function select,
which has no line number information.
ham_loop (single=0) at event.c:482
482                     if (debug_event ())
(gdb) n
484                     pthread_mutex_lock (&time_event_mutex);
(gdb) p time_event_list
$1 = (struct event *) 0xbfba8
(gdb) cont
Continuing.

Program received signal SIGINT, Interrupt.
0x401cb218 in select () from /usr/src/trunk/target/fs-cpio/lib/libc.so.0
(gdb) cont
Continuing.


Device :
ulimit –c unlimited
重啟 server , 重要!
等待 server 掛掉
cd /usr/sbin
tftp -p 1.2.3.4 -l core.數字

PC
/tmp/gdb-6.8/gdb/gdb  /tmp/server_0912010954
#必須是沒有被 strip 的版本, 可以修改 Makefile arm-linux-strip 之前插入 cp server /tmp/server_`date + %y%m%d%H%M` 來時常保留備份

#進入 gdb
(gdb) set solib-search-path /home/project/lib/
(gdb) core /tftpboot/core.數字
        #可以看出一點眉目
(gdb) bt
        #通常這邊可以看出問題
(gdb) up 或是 down
(gdb) print <變數>
        #變數通常是 function 傳進來的變數.



A patch to vim7.2 to let vim support gdb . 



我是新增 ~/.armgdb 內容:
set solib-search-path ~/TPL/target/tplfs-cpio/lib/
handle SIG33 nostop noprint pass
handle SIG32 nostop noprint pass
handle SIGTRAP nostop
handle SIGINT nostop noprint pass
handle SIGTERM nostop noprint pass
#target remote 172.16.15.77:1234

然後執行 gdb 
gdb -x ~/.armgdb

nfs mount 出問題了,真神奇

同事於 arm device 上發生困難求助
#mount -t nfs -o nolock 1.2.3.4:/home/skyter/nfs /nfs
出現錯誤訊息 (我記得是 no such directory)

首先我懷疑 device 上 /nfs 目錄不存在,所以 ls -al 發現有 nfs 目錄

所以懷疑 server 設定有問題,先確認 1.2.3.4 /home/skyter/nfs 目錄存在
接著觀察 /etc/exports
$sudo vi /etc/exports
結果也沒問題,/etc/exports 檔案屬於 nfs 的一部分,可以 man nfs 看說明
如果 /etc/exports 檔案不存在,則 nfs service 未安裝,可 apt-get install nfs-kernel-server 或者 yum install nfs-xxx 安裝,實際情況可能要 google 一下你的 Linux 套件是用於哪一種安裝指令,以及正確的 nfs 套件名稱

接著確認 nfs server 有重啟,還是不行

接著 sudo, cd 到 /var 可以觀察到 spool (用來寄 mail), mail .... log 很多目錄,這些是 Linux 系統使用的檔案,而我們要觀察的是 log 目錄裡面的內容,因為各種 service 都會把記錄儲存於此處

ls -alrt /var/log 可以按照時間排續新的最後面,看看最近幾分鐘內系統記錄了什麼資訊,因為是 Ubuntu , 所以可以看到 syslog , auth.log 皆有變動
tail syslog 或者 tail -n 30 syslog 可以看到最後面最近發生的記錄,可以看到 1.2.3.4 確實有來 mount /home/skyter/nfs.
tail auth.log 則沒有觀察到 nfs mount 相關資訊

dmesg 是系統內部命令,也可以觀察到 nfs 如果有問題時是否有記錄
於 server 與 device 執行
#dmesg | tail -n 20
都沒有看到相關訊息

因為 nfs mount 透過網路,而 Device 位於不同子網段,所以懷疑網路路由有問題,從 device ping server 有回應,route -n 顯示路由也沒問題

接著在 server 執行
#ifconfig 觀察主要網路卡是哪一張,通常是 eth0
#tcpdump -i eth0 -n host 1.2.3.4
然後 device 再執行一次 mount nfs , 有看到網路封包,但是看不到內容
-i eth0 代表監聽 eth0 網卡,-n 代表不要對 ip 做 name 的 dns 反查動作(浪費時間) , host 1.2.3.4 代表過濾監聽發送/接收方是 1.2.3.4 的封包

完整側錄封包存檔供 wireshark 分析
#tcpdump -i eth0 -n host 1.2.3.4 -s 1600 -w xx.pcap
-s 1600 代表每一個封包最多記錄到 1600 bytes , 已經足以涵蓋完整的 ip 封包大小 (約 1500 bytes 左右) , 預設值很小不足以分析
-w xx.pcap 代表全部血到 xx.pcap
再 mount nfs 一次後,Ctrl + C 停到 tcpdump

不管透過 scp, nfs, http, 或者 Linux 桌面,打開 Wireshark (Win/Linux/Mac) 去開啟 xx.pcap 檔案
其中有兩段 connection , 你可以右鍵隨便一個封包,選擇 Follow , 或者是在正常檢視下去玩弄每一個功能,最後你應該會觀察到 nfs 的 req / reply .
在這邊顯示一切正常,沒有錯誤。

所以 server , 網路都沒問題,看起來問題出在 device (kernel or user space ) , 所以啟動 strace (arm 版本), 如無 strace , 則 google 找抓下來自己編譯,丟到 device 上去跑 (記得 chmod 755 strace)

#./strace mount -t nfs -o ..................
注意最後幾則 syscall 監聽,可以看到 mount 呼叫發生錯誤,一樣是 no such directory .
這時候我
#pwd
注意到目前位於 /root , 而 nfs 目錄件於 /root/nfs
難怪 mount fail , 所以應該改成
#mount -t nfs -o nolock 1.2.3.4:/home/skyter/nfs /root/nfs


收工

Saturday, September 26, 2015

肥皂酸鹼度

因為小孩常被蚊嬰兒時子叮,塗了防蚊液雖不癢但是隔天仍然腫得很大,我得假設是蚊蟲中的甲酸讓身體引發嚴重的過敏反應造成,原本想上網買氨水,但是買不到,又不敢用水族箱的氨水來塗抹,(雖然可以抹尿,但覺得很噁心,尿中含氨水成分)

意外發現網路上傳的塗肥皂招數,理論是酸鹼中和,(氨水也是鹼性, 另外就是小蘇打粉粉)。

相比起來,拿肥皂塗在叮咬傷口上,是比較可以被接受的。市面肥皂多種,所以拿家中肥皂來做測試:
水7
Dove多芬 6.2
麗嬰房 nac nac 橘色透明 8.5
水晶肥皂 9.4
碁峰父親節 白色肥皂內含黑色點點 9.37
五雀女手工皂 9.23
施巴5.5嬰兒泡泡浴露 5.46
黑人超氟牙膏 6.41

測試工具是一隻PH電子數位測試筆

結論是南亞水晶肥皂適合

我在猜想,如果嬰兒時被蚊蟲叮咬,洗澡時又怕熱水加入施巴,後果應該會很慘。



Thursday, September 24, 2015

VOLVO 850 方向燈閃爍器修復

我一直以為讓方向燈閃爍的東西,一定是一個小盒子藏在某一個地方,事實上我只想開進修車廠 : [老闆,幫我修理一下方向燈] ,然後提錢贖車就好。

但沒那麼簡單,首先是老闆認為線路只是接觸不良,所以才會閃了約 30 秒後就不閃了。然後也沒修好,這陣子上路我覺得我遲早會發生車禍,畢竟沒人看得到我的方向燈。

打開 Volvo Manual Services and Repair 翻看許久,我比較確定這該死的小盒子隱藏在故障燈開關的後方,搞不好做在一塊







接著我上網找對應的東西,找到了,只要 300 塊錢新台幣,而且我的車是 1993 年出廠 (沒錯,超過20年的老車了) ,所以是這東西沒錯。

收到貨之後,用一塊錢銅板把故障燈開關挖出來,接上新的塞回去,我的方向燈就修好了。







海思 IVE 2.0

這真的是很奇怪的事情,透過 Google 基本搜尋不到 IVE 的任何相關網頁。(透過百度可以找到一些,但真的很少)
整理一些重點
我觀察到範例有
  1. Canny
  2. 背景建模
  3. GMM
  4. 遮擋偵測 (Tampering)
  5. Sobel
  6. ANN
  7. ShiTomasi And LKOpticalFlow
  8. SVM
SVM
有 create table Feature,
Predict 預測
Kernel 分成
LINEAR 线性核函数
POLY 多项式核函数。
RBF 径向基核函数。
SIGMOID Sigmoid 核函数。
分类模式。
回归模式。
看起來 SVM 用在分類上
https://cg2010studio.wordpress.com/2012/05/20/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%A9%9F%E5%99%A8-support-vector-machine/
ANN
ANN_MLP_LoadModel
读取ANN_MLP 模型文件,初始化模型数据
ANN_MLP_Predict
创建单个样本ANN_MLP 预测计算任务。
原理与 OpenCV 中ANN_MLP 类似。
机器学习研究项目--以机器视觉工程师的视角(MLP篇)
这里主要研究实现MLP和CNNs。设计到的工具为Opencv和专门用来解决CNNs问题的代码,数据集是Mnist。
2.Opencv中提供的MLP相关函数,核心为CNN的创建。这里的layers不是神经网络层,而是Opencv对MLP创建定义的一种参数输入方式。里面有两点是可以修改的,一个是_neurons,这个对应的是神经网络层数;一个是CvANN_MLP::SIGMOID_SYM对应的是ann的训练方法.
所以 海思 ANN 是一種類神經網路,跟 Face Recognition CNN 相關連

ShiTomasi And LKOpticalFlow.
http://www.cs.princeton.edu/courses/archive/fall08/cos429/optiflow.pdf
光流追蹤法 , 用來在  Frame 中尋找原 frame 中的物件,判定移動速度方向,
問題 :
LK : 如何決定這張 frame 於另一張 frame 中的特徵 ?
Shi-Tomasi : 如何選擇哪些特徵是 "好" 追蹤的 ?
特徵在時域一系列 frame 中維持相同
前提 : 移動是平滑的
我的問題是,這演算法要拿來做什麼 ? 既然海思琪他 API 都跟 Tracking 無關,那這演算法應該是拿來追蹤物件用的 ..

Google Linear Book Scanner 書本掃描器(1)

原因: 書太多
解法: 掃描成電子書 PDF 個人保存,原書資源回收

為此我買了大型裁紙刀,可以裁掉一整本書書背,也買了 Scansnap 系列掃描器,確實消滅了好幾十公斤的書本。但仍然覺得不完美,所以打算製作 Google 掃描器。

http://linearbookscanner.org/
https://code.google.com/p/linear-book-scanner/

其中參考 Michigan Prototype 2 Final Report 歸納出幾個重點


  • 塑膠板材比起鋁板對於書本的磨擦力更小,更順暢
  • 書本夾腳 60 度比 90 度更適合,使重量集中在書脊上而非書頁上
  • 錯誤檢測 : 接近感應器,偵測書頁是否進入換頁槽
  • 電容感測器,偵測是否多頁進入換頁槽
也購買了 Canon LIDE 210, 打算使用的命令稿來源
至於舊型的 LIDE 110 100 之類的因為掃描速度太慢了,所以直接放棄 (似乎也不支援 scanimage 指令)
其實就算是 LIDE 210 也還是太慢

之前參考某些 Book Scanner ,結論是別浪費時間了,我沒時間一頁頁慢慢翻
Once you have built the scanner, all you really need to do is lower the book, turn the page, raise the book, snap the pictures (by pressing down on the brake handle), and repeat. We were able to scan roughly 150 pages per minute—making quick work of even a 400-page book

熱水器免換電池

現在新的熱水器幾乎都是直插 110V 免更換電池,但是遇到舊型熱水器還在使用 1.5V 大電池,就覺得很煩,幾乎每一兩個月就要下樓買電池,尤其遇到瓦斯點不著的時候更是超級火大的,在廁所裡跟該死的熱水奮戰。

所以透過以下的示範,就可以不用再更換電池了。

首先你得要找到 1.5V 的變壓器,這其實有點難找,不過露天上還真的有人賣,也不貴,大約兩百元有找,反正一顆電池也要 $25 吧 (忘了),而且花錢事小,浪費時間買電池才煩人。

  1. 買來後,剪刀直接把變壓器接頭剪掉,露出兩根線芯。
  2. 使用現有舊電池,將兩端電極用膠帶絕緣,避免變壓器一直對電池充電,畢竟變壓器是要取代電池,在此只是借用電池的外型。
  3. 兩根線芯適當的固定在電池兩極上(要露出部分線芯,取代原電極),一樣用膠帶固定,膠帶萬能。
  4. 插入熱水器
  5. 打開熱水,收工












CNC Cam STL 軟體

尋找適當的 STL 轉 Gcode 軟體,因為 ArtCAM 會一直當,所以來找找看其他軟體。

http://www.cnccookbook.com/MTCNCSoftware.htm
There are a variety of programs available in this category including:
- OneCNC: The first CAM package I learned, easy to use and very popular on our CAM survey.
- VisualMill: One of the most popular packages on our CAM survey.
- Mastercam: The market leading CAM package by many measures.
- HSMWorks: A fresh look at CAM, extremely powerful, and brought to you by the Cimco people.
- Bobcad: Very popular entry level package.
- Meshcam: A super easy to use 3D only package we recently reviewed.
- Dolphincam: Another entry level package I'll be taking a look at soon. Reports are it is very good

http://www.cnczone.com/forums/woodworking/102534-actually_cut_stl_file_computer-numeric-control.html

先來試試看 MeshCAM

感覺還不錯用,每一個設定都是簡單直接,除了定義刀具尺寸,以及最後的粗雕,細雕,筆雕的設定看不太懂外,都很清楚明瞭。
它甚至可以讓你定義支撐的位置,這樣才不會雕到最後時,模型被刀頭旋轉扔出去.

OpenSCAD 六角形原來是這樣做的






原本在做 3D 印表機 Sanguinololu 的主版風扇框架,很納悶他是怎麼弄的可以在尾巴生出六角形,剛剛試著用 circle 玩了一遍不得其解,作罷上網找看看。如下圖我用圓形兜得很醜


沒辦法像這樣


 

/* Left Side */
cube ([THICK, LENGTH, H2]);
translate ([THICK, LENGTH, 0]) {
difference () {
linear_extrude (height = H2)
circle (r=R1);
linear_extrude (height = H2)
circle (r=R2);
translate ([1,0,0]) linear_extrude (height = H2)
circle (r=R2);
}
}

沒想到這麼簡單,只要把 $fn 設為 6 就可以了。