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

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 不是來路不明的東西。

2015年5月29日 星期五

找不到,等於沒有擁有 - 談日常生活中的知識管理 (一)(針對日期使用 find 指令)

檢索能力,其實本質上是提高自己行事效率的手段之一:自己不必重新蒐集、思考自己曾經從資訊中提煉出來、成為知識的東西。在資訊爆炸時代的現在,四周有著更多 buzz words 、各種產業、技術不斷地翻新,前進速度不夠快、一直耗在重新提煉舊知識的人,最終就是跟不上時代。因此,在當代,檢索能力更顯得重要。

出處我已經想不起來了,記得很久以前,曾經聽來一句話,大意是說

「當你需要使用的時候,卻沒辦法找出來的資訊、物品,等價於你沒有擁有他」

這句話滿深刻地改變了我的一些生活哲學,包括自我知識庫(包括照片等回憶)的管理。現在我在評估檢索資訊效率時,所採納的標準為:「自己需要的資訊,能不能夠從自己的知識庫中,在九十秒內取出。如果不能,該次知識的建立就是失敗的。」

小學還是國中時做的剪報(天啊好老派),過去重新取用裡面資訊的次數大概一隻手數得完,而且,裡面的資料我幾乎只能從第一頁翻到最後一頁才能決定哪些是我要的資訊。這顯然是個非常失敗的建立自我資料庫行為。類似這樣不斷囤積資料的習慣在我的一生中持續地進行著至今。幸好,今日資訊系統的軟、硬體效能與普及率,已經不像是當年,那個可能只能選擇剪報的時代,而因此讓我可以不斷改進自己的檢索方式。

從這篇起,我打算陸續整理一些自己日常生活中,所使用的知識管理方式。這些方式不一定是最好的方式,所以也歡迎大家批評、賜教。




案例:

  • 我想要找一張某次我收看網路直播的活動時,自己的螢幕截圖。


手上有的索引資訊:
  • 不記得自己的螢幕截圖是否有好好重新把檔案命名,以便索引。
  • 記得活動名稱、當時的主持人名字。
  • 不記得活動日期。

檢索過程:

  • 手動大概翻一些可能的資料夾未果。不願意投入更多時間成本做土砲搜尋。
  • 大概用關鍵字對自己的電腦做搜尋,但因為知道不記得自己的螢幕截圖是否有好好重新把檔案命名
  • 使用活動名稱、當時的主持人名字,因此取得活動時大概的日期。
  • 使用日期,在可能的資料夾下,針對檔案更動、讀寫日期做搜尋。請見下面指令。
  • 只有不到十筆資料,經檢視後順利取得自己想要的圖片。
find ./Documents/ ./Pictures/ -type f -newermt 2011-09-22 ! -newermt 2011-09-23




指令參考:
http://stackoverflow.com/questions/158044/how-to-use-find-to-search-for-files-created-on-a-specific-date