發表文章

目前顯示的是 3月, 2010的文章

文章總列表

強力Debug技巧: 攔截function & Backtrace (2)

第一招是攔截任意 standard C library 的 function 在下面的範例裡, 攔截的對象是 atoi() 首先主程式長這個樣子... Main program (hello.c) #include <stdio.h> int main() { printf("I love debug >_<\n"); printf("atoi(100) = %d\n", atoi("100")); return 0; } 用 gcc 編譯這個程式並且執行, 結果大概長這樣子: gcc hello.c -o hello ./hello I love debug >_ atoi(100) = 100 ---- 所謂的攔截atoi(), 就是寫了另一個atoi(), 名字和 standard C library 的一樣. 讓程式在執行時, 呼叫到自己寫的atoi(), 而不是library提供的. 這個偽atoi()的程式碼如下: Wrapper function (atoi_wrapper.c) #define _GNU_SOURCE #include <stdio.h> #include <dlfcn.h> // ATOI-wrapper int atoi(const char *nptr) { int ret; // Get pointer of REAL-atoi by shared library int (*real_atoi)(const char *nptr) = dlsym(RTLD_NEXT, “atoi”); // Before REAL-atoi, do some hacking printf(“[ATOI] before REAL atoi()\n”); // Call REAL-atoi ret = (*real_atoi)(nptr); // After REAL-atoi, do some hacking... pri...

2010 花東自行車賽 3/14 台北八里練習 單車

今天早上睡過頭, 沒能跟到捷安特的團 所以我決定, 獨推追上他們 (AM8:30) 我的盤算是, 我應該可以不休息直達目的地 他們到了八里也會休息一下, 我有機會補上一個半小時的落差 不過後來我才知道, 今天節目改成八五山, 這是之後的事了 天氣很好, 微微的南風, 使我的追擊非常順利, 一路時速超過30北上 考慮到最差的狀況, 如果都沒能碰頭, 今天勢必得獨自來回 沿路用高迴轉速的騎法, 減少肌力的消耗 碰到短爬坡段, 降齒輪比, 迴轉速拉高到 120 等上坡以後再增加齒輪比, 用正常的迴轉速繼續巡航 (100~110) 少了重踩衝上坡的激情演出, 沿途心跳最多 17x 今天也得到一個重要數據, 心跳超過 175, 稍後得花更長時間才能恢復 追擊非常的順利, 最後我抵達八里的平均速度約 30.8 km/hr, 70KM 除了紅綠燈停下來以外, 沒有任何休息, 自己都覺得殺很大 科科, 就在這時候, 我得知今天沒來, 最差的狀況真的出現了 ---- 逆風騎車, 壓低身軀可以降風阻, 控管肌力能騎得遠, 最重要的, 還是意志力 在身體真的罷工以前(抽筋), 不要自己先罷工了 我的體能在里程破百附近有點下降, 正好這段是上下坡最頻繁的地方 路上遇到一團車友, 騎公路車的朋友, 跟我跟得好近, 好像想尬車的樣子... 我維持原本的步調 (~32), 不打算跟或輪車, 我只想獨推練車 倒是這個速度加上逆風, 我們只能看誰先受不了吧 Orz 先受不了的是我, 我實在沒本事上坡加速 但是續航力的部份, 上坡加速通常會伴隨一些報應, 橋上的風又大... ---- 騎到後段就只剩維持住速度的力氣, 長途騎下來, 最後肌力還是會燒光 我現在已經很習慣 100的迴轉速, 這種騎法效率好很多, 到最後還能維持速度 (~28) 但是注重肌力的騎法我還會練, 爬山段轉速帶不起來時, 還是只能硬上 最後我到達的平均速度約29.2, 140KM, 自我感覺像快死了一樣 回程除了紅綠燈, 以及終點附近去便利商店買沙士, 一樣沒有額外的休息 接近五個鐘頭狂飆, 滿爽的 :D

2010 花東自行車賽 3/6 台北八里練習

為了備戰今年的花東自行車賽 (4/16, 4/17) 昨天和捷安特中華店的朋友騎到台北八里練車 下午兩點, 十輛車從新竹出發了 這是第一趟長距離的練習, 檢驗項目大概是 - 各種心跳的區間 * >180 攻擊, 疲勞大量累積, 只能支撐 30 秒, 疲勞很久才能排除 * 170 ~ 180 加速, 疲勞逐漸累積, 連續30分鐘沒問題 * - 高轉速的騎法 * 低轉速 -> 高肌力輸出, 心肺負擔輕, 肌力恢復慢 (腳酸痛很久才好) * 高轉速 -> 低肌力輸出, 心肺負擔重, 心肺恢復快 (喘完氣就OK) 我習慣的轉速不高, 大約90轉, 是理想轉速 90~120 的下緣 這陣子刻意練習 100/110rpm 左右的高轉速 目的是練出另一種武器(心肺), 好跟肌力搭配使用 花東公路上有很多短坡, 集團不可能減速通過, 所以瞬間提高輸出功率很重要 緊接著平路段, 在一定的速度下, 恢復疲勞更重要 承受一波又一波加速同時, 跟上集團, 享受比賽 ---- 長程練習捷安特會再排幾趟, 我個人會加碼爬宇老練山地段 (連續爆心跳測試) 比賽前會想辦法每天騎車, 把體力調整到最好的狀態 捷安特三月份還有這些活動, 有興趣一起來玩吧 :D 3/14(日),早上7點,300K體驗組,捷安特中華店→紅毛港→八里十三行博物館 3/21(日),早上7點,捷安特中華店→羅馬公路 3/28(日),早上7點,集合地點:捷安特中華店→飛鳳山

[書評] Programming from the Ground Up

Programming from the Ground Up http://ftp.twaren.net/Unix/NonGNU/pgubook/ (免費下載) ---- 這是一本觀點獨特的書, 他用組合語言的方式, 闡述程式最底層的世界 這樣講聽來有點空洞, 直接看這本書第一個程式吧 Chapter 3. Your First Programs ---- .section .text .global _start _start: movl $1, %eax movl $0, %ebx int $0x80 這是 Linux底下, 一段小到不能再小的程式 程式從 _start 進入, 然後設定 x86 暫存器: %eax = 1, %ebx = 0 int $80 是發出軟體中斷的指令, 其中 0x80 代表 Linux System Call 呼叫 System Call 的時候 %eax 放 system call ID, 1 表示離開程式 %ebx 表示 main function 的 return value 呼叫完這個 system call, Linux 就會結束程式 並把 %ebx 的內容當作 main() 的回傳值 User 接下來可以在 shell 裡, 打 echo $? 觀察這個回傳值 ---- 這個例子真的口味獨特 !! 他解釋一般程式是怎麼和 OS 溝通, 怎麼呼叫 system call 另外用很少的程式碼, 解釋組合語言的設施 看過這一小段程式, 起碼我知道, 當我呼叫 exit() 時, 原來做了這些事 書上還有用組合語言, 寫一小段程式, 開檔, 把所有字轉大寫, 存檔, 關檔 WHAT !! 用組合語言做這些事喔 !! 當我親自寫了這段程式, 心中的感動是無以言喻的 :) 推薦給所有想知道事物真正面貌的人閱讀 :) ---- Chapter 4 "All About Functions" 函數, 對應到的 assembly 語言, 這個是極端重要的 topic 靠這章的幫忙, 我總算是懂 x86的 stack frame 而且也真的寫了一些 assembly function 來呼叫 這章的範例是一個函數, 計算 2^3 + 2^5, 然後回...

強力Debug技巧: 攔截function & Backtrace (1)

因為工作的關係, 我得用某段別人寫的code來做事 有句話是這麼說的, 用別人寫得code, 好比用在別人用過得保險套 雖然很噁心, 但是這句話真的是很貼切啊 XD 一個念頭閃過腦袋: 砍掉重練會不會比較好? 答案是: 不會 !! 因為這些程式碼都是經過千錘百鍊的結果 砍掉重練? 我還是先把自己砍掉好了 XD 像這種時候, 我就會換上作股票的思維: 會動的東西就是財產, 這才好過點 ---- 所以我先找了一些reference 王建興先生有一系列很不錯得文章 "閱讀他人的程式碼" http://www.ithome.com.tw/itadm/article.php?c=47717 這些文章再讀一次, 感覺大不同了 我做好思想準備以後, 開始閱讀手邊的程式了 戰略目標是, 先完成手邊工作再說, 詳細運作細節可以之後慢慢推敲 我回想起以前當BBS站長, 我也是這樣讀那一堆程式碼, 突然覺得"親切"起來... ---- 我想跟老大說, 我可以看個半年, 都會了以後再開工嗎? 我可能得在紙箱和開工之間做個選擇 Q_Q 在這種狀況下, 我只好用一些奇技淫巧, 這是這篇文章想說的東西 因為我看不懂很多程式, 但是我又得在時限內完成工作, 還有一些 bug 要找 來看看我用了哪些怪招吧 - Intercepting Arbitrary Function - Back Trace 第一招用來攔截任意 function, 舉例來講, 很多地方都會呼叫 fprintf() 如果 printf() 有 source code 可以讓我改 我會想在裡面加點料, 看是來點 debug message 或是動點手腳 這件事做得到嗎? 基本上有兩個做法, C library 是真的有 source 可以改, 不過我完全不想用這招 XD 另一招是 setiathome 團隊用的, 他們去攔截 fstat/fopen/fwrite 這類的函數 把他導向到其他 function (當時要搬家到新平台, 他們不想改舊的 code) 這招就是我要得答案了 :D 已經有程式碼的東西就不用這麼大費周章了, 這招可以對付只有 library 的對象 實際施展起來, 我真的覺得太神奇了, 到底是誰發明 shared library 的這些怪招 ---- Ba...