顯示具有 ubuntu 標籤的文章。 顯示所有文章
顯示具有 ubuntu 標籤的文章。 顯示所有文章

2015年8月1日 星期六

cython workshop 150801 上課內容整理(一) - 環境架設

這天在摩茲工寮有一個一天的 cython workshop,最近因為開發 SOLVCON 所以開始需要寫一些 cython ,加上講師陣容看起來很堅強,所以毫不猶豫就報名了。

環境架設


這次 workshop 使用 vagrant 來準備測試用的環境。這算是我第一次用 vagrant。對於 vagrant 架設測試環境的快速與簡易,感到有一點小小驚喜。大致來說,vagrant 提供一個方便操作的前端,用 virtual box 來做實際的虛擬環境;網路上已經有很多介紹 vagrant 的文章,我在這裡就不多加描述。

我自己的筆電是 Ubuntu 14.04,接下來所有的操作與描述都是基於這個環境。

在 host machine 裝 virtual box 和 vagrant


安裝 virtual box


使用 Ubuntu 的軟體中心搜尋 virtual box 或是使用指令

sudo apt-get install virtualbox

如果在 virtualbox 的執行不太正常,請確定系統中在安裝完 virtualbox 之後,有 virtualbox-dkms 這個套件。確保 virtualbox 和你當下的 kernel 版本能夠很好地合作。

安裝 vagrant

sudo apt-get install vagrant

(這麼好裝,是時候喊一下「我愛 debian-based 的套件管理!」)

取得上課用的 source code


git clone https://github.com/yungyuc/cythonup.git

如果上面的 branch 失效,可以改用我對這個 git branch 的 fork

git clone https://github.com/tai271828/cythonup.git

取得上課用的測試環境 image


課堂上已經有提供包好的 image ,使用 debian jesse 64 bit。
把這個 image 和相關設定檔 copy 到同一個目錄,
然後匯入 vagrant 就好。
匯入 vagrant 的指令:
vagrant box add debian/jessie64 ./package.box
package.box 是講師事先準備好的 image 名字。debian/jessie64 是稍早從上面 github 取得的 vagrant 設定檔 Vagrantfile 裡面寫死的名稱。

因為我沒有附上上課的 image,這裡提供一個另外的方法取得 image。我沒試過這些方法,大概會遇到一些問題。只是打算提供讀者一些可能可以用的資源。這個連結裡面有一些別人事先準備好的 image (請注意我沒有驗證過這個網站和 image 的安全可靠性),使用下面這個指令去取得 image,注意請盡量也是選擇和課堂一樣的 jesse 作為 image,盡量讓差異少一些。使用下面的語法把 image 匯入 vagrant:
vagrant box add {你想要的Box名稱} {下載網址,請見上面連結}
我大概可以預期至少會遇到某些套件缺少或是相依的問題,應該少什麼裝什麼大概就可以解決掉大部分的問題。vagant 似乎也有提供官方下載的站台,我試了一下覺得要從台灣下載實在太慢了,沒耐心等他跑完。

啟動 vagrant


到有 Vagrantfile 的同一個目錄下,執行
vagrant up

啟動 ipython notebook server

因為講師打算使用 ipython notebook 作為講義,所以我們來開啟一個這樣的 server 來閱讀講師提供的講義。

透過 ssh 進去 vagrant 準備好的虛擬環境

vagrant ssh

在此虛擬環境中啟動 ipython notebook server

vagrant@debian-jessie:~$ ipython notebook --ip "*" --no-browser

這個指令的意思就是啟動 ipython notebook server,並且不要主動打開瀏覽器(因為我們不要在虛擬環境中打開瀏覽器)。啟動後,在 hostmachine 裡面打開你的瀏覽器,開始瀏覽

http://localhost:8888/

2015年7月16日 星期四

Debug C program on Ubuntu

很多 GNU 工具都是用 C 寫的,用這些工具用久了偶爾難免會踩到 bug ,在 Ubuntu 上有很完整的生態系可以協助開發者很快架設好除錯環境。

今天好像踩到一個 isoinfo 的 bug ,加上很久沒有這樣玩了(都在寫 python ,哈!),所以又重新走了一遍整個準備除錯環境的步驟,趁著記憶猶新趕快整理下來。isoinfo 這個指令來自 genisoimage 這個 debian package,下面我就直接用這個當範例。

取得 source code

apt-get source genisoimage

一步就完成了,真是貼心的服務。[1]


取得 debug symbol

Ubuntu 使用的 debian package 中,名稱帶有 -dbg 或是 -dbgsym 後綴者,都是對應 package 的 debug symbol。-dbg 通常在預設的 repository 就可以找到,-dbgsym 則是要從另外的 repository 取得,方法如下[2]:

加上新的 repository、取得公鑰[4]、更新 apt list、安裝:

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs) main restricted universe multiverse" | sudo tee -a /etc/apt/sources.list.d/ddebs.list
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
sudo apt-get update
sudo apt-get install genisoimage-dbgsym[3]

準備 gdb

至此為止其實已經準備好除錯環境了,不過為了更輕鬆一點,我們可以把待會自己想要用的 gdb 指令寫成 script。

set substitute-path /build/buildd/cdrkit-1.1.11 /tmp/asdf/cdrkit-1.1.11
b 681
run

/tmp/asdf 是稍早我使用 apt-get source 時取得的 source code 路徑,set substitue-path 是告訴 gdb 不要使用 dbgsym 中提示的舊路徑(/build/buildd)而去用新的(/tmp/asdf);所謂的舊路徑是在某人的電腦上編譯 dbgsym 的時候對應到的放 source code 的路徑,他的環境當然跟自己的會不一樣,所以要稍微調整。

最後開始享受除錯的樂趣吧!

gdb --args isoinfo -R -i ./my-customized-image.iso -x /casper/filesystem.squashfs


[1] 嚴格來說應該要注意自己想要除錯的 binary 版本和 source code。這可以用 dpkg -l package 來查詢版號。
[2] https://wiki.ubuntu.com/DebuggingProgramCrash
[3] 當然也是有版號問題,不過範例中我知道我這樣拿下來會是我系統中對應的版號,所以我就省略了。
[4] 只是為了確定下載下來的 package 不是來路不明的東西。