星期一, 1月 31, 2005

核心傾印, core dump

本文重點是第三節 III. Generating core without fatel error. 前兩節為 core dump 之背景介紹, 熟悉這套機制的人大可略去不看, 不影響對第三節的理解.

I. What's core dump?
core dump 是 Unix 上程式執行發生錯誤時, 將記憶體裡的內容做 snap shot, 存到檔案裡. 以方便 debug. 尤其是如程式區段錯誤 (Segmentation fault) 之類的錯因為經常難以重現, 在缺少 core file 的情況下很難解決. 程式設計師對於 core file 只能說是又愛又恨. 因為出現了代表有錯, 少了它又難以除蟲.

II. How to use it?
許 多系統上平常就算程式發生錯誤同樣不會產生 core file. 這是因為不是人人都用得到, 而且 core file 的大小通常不小, 普通使用者用不到沒注意到相當佔硬碟空間. 要開啟 core dump 要使用 limit (tcsh) 或 ulimit (bash, ksh).
tcsh$ limit
cputime unlimited
filesize unlimited
datasize unlimited
stacksize 8192 kbytes
coredumpsize 0 kbytes
memoryuse unlimited
vmemoryuse unlimited
descriptors 1024
memorylocked unlimited
maxproc unlimited
tcsh$ limit coredumpsize 8192

bash&ksh$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 8189
virtual memory (kbytes, -v) unlimited
bash&ksh$ ulimit -c 8192
這樣會將 core file 的大小限制在 8M 以下. 這樣執行有問題的程式時:
$ cat t.c
#include

int main(){
int* p = NULL;
scanf(" %d", p);
return 0;
}
$ gcc -g t.c
$ ./a.out
1
Segmentation fault (core dumped)
$ ls
t.c a.out core
$ gdb -q a.out core
...
#0 0xb7eff18e in _IO_vfscanf_internal () from /lib/tls/libc.so.6
(gdb) where
#0 0xb7eff18e in _IO_vfscanf_internal () from /lib/tls/libc.so.6
#1 0xb7f09458 in scanf () from /lib/tls/libc.so.6
#2 0x080483ae in main () at t.c:5
就很容易確定問題出在哪裡了.

III. Generating core without fatel error.
這 次 blog 的重點其實在這一節. 不知道為了什麼原因, in2 想讓一支程式產生 core file 但是正常運行. 如果不是這樣的話, 把 limit 打開, 然後 kill -SIGABRT 就足以產生 core file 了. 事實上 FreeBSD 上很容易做到, 只要用 gcore(1) 就可以了:
$ cat t.cpp
#include
#include

int main(){
int a;
std::cin >> a;
sleep(10);
std::cout <<>
return 0;
}
$ g++ -g t.cpp
$ ./a.out
1
^Z
[1]+ Stopped ./a.out
$ ps
PID TT STAT TIME COMMAND
59960 p1 Ss 0:00.05 -bash (bash)
59996 p1 T 0:00.00 ./a.out
59997 p1 R+ 0:00.00 ps
$ gcore 59996
$ fg
./a.out
1
$ gdb a.out core.59996
...
#0 0x481361b4 in nanosleep () from /usr/lib/libc.so.4
(gdb) where
#0 0x481361b4 in nanosleep () from /usr/lib/libc.so.4
#1 0x48101a26 in sleep () from /usr/lib/libc.so.4
#2 0x80486d8 in main () at t.cpp:7
(gdb) up
#1 0x48101a26 in sleep () from /usr/lib/libc.so.4
(gdb) up
#2 0x80486d8 in main () at t.cpp:7
7 sleep(10);
(gdb) list
2 #include
3
4 int main(){
5 int a;
6 std::cin >> a;
7 sleep(10);
8 std::cout <<>
9 return 0;
10 }
(gdb) output a
1(gdb) q
可 以看到, 用 gcore 就可以產生 core file 同時讓原程式正常執行. 而事實上他要的是 Linux 上的 solution. 在沒有直接一支 gcore 程式的情況下, google 了一陣發現 Linux 幾個 distribution 裡的 gdb 原始碼都有出現 gcore 的內容, 可是都沒有編譯出獨立的程式. 於是估且一試:
(gdb) help gcore
Save a core file with the current state of the debugged process.
Argument is optional filename. Default filename is 'core.'.
(gdb)
全部用法:
$ cat t.cpp
#include

int main(){
int a;
std::cin >> a;
std::cout << a << std::endl;
return 0;
}
$ g++ -g t.cpp
$ gdb -q a.out
Using host libthread_db library "/lib/tls/libthread_db.so.1".
(gdb) b 6
Breakpoint 1 at 0x8048777: file t.cpp, line 6.
(gdb) r
Starting program: /tmp/a.out
23

Breakpoint 1, main () at t.cpp:6
6 std::cout << a << std::endl;
(gdb) gcore
Saved corefile core.20251
(gdb) cont
Continuing.
23

Program exited normally.
(gdb) q
$ gdb -q a.out core.20251
Using host libthread_db library "/lib/tls/libthread_db.so.1".
Failed to read a valid object file image from memory.
Core was generated by `/tmp/a.out'.
Program terminated with signal 5, Trace/breakpoint trap.
...
#0 main () at t.cpp:6
6 std::cout << a << std::endl;
(gdb) output a
23(gdb) q

星期日, 1月 30, 2005

晚睡

身體似乎漸漸習慣了這種睡眠時間. 前幾天聊天、寫程式弄到兩點、四點都會昏昏沉沉的. 可是今天很自然地就醒到現在. 這看來不是好事, 至少可以毫無目標地在 irc, bbs, 信箱和 bug tracking system 之間晃上幾個小時並不是優點.

星期三, 1月 26, 2005

教徒與家長

我不信任何宗教, 也不排斥 (幾乎) 任何宗教. 前陣子 ptt 的 Hate 板出現關於教徒的爭論, 只能用鬼扯來形容, 不具價值. 而以下是個人對於特定人士的觀感.

家 樓下住著一家基督徒, 父母和四個小孩. 這家每天打小孩, 幾乎已經到了照三餐的地步. 每次開打小孩子都四處亂竄, 全家各個角落都換傳來爸爸的叫罵、小孩的哭聲、和小孩哭喊著「不要再打了.」至於時間, 從周末假日的早上七八點到平日的晚上十一二點都有可能. 有趣的是從來都是爸爸動手打小孩.

至 於他們家是怎麼樣的教徒呢? 就我所知, 每個禮拜天一大早都會盛裝去做禮拜. 而媽媽也曾經帶著讀物和聖經上門傳教, 因為那份讀物, 所以我知道他們是耶穌見證人的會眾. 我國中二年級時的工藝老師正巧也是此會的姊妹. 當時就是以這本讀物一篇一篇仔細介紹她們的信仰 (事實上在上課時間做這種事似乎也不是很好?).

以上是背景, 而發生了什麼事呢? 今天晚上十點多回到家. 到一樓時, 剛好他們家其中兩個小孩 (兄妹) 抬著廢紙要放到集中搜集資源回收的地方. 雖然不是太大箱, 可是相對於他們的身高、體型可真只能用抬的. 不幸的是, 他們不小心弄翻了. 就在他們七手八腳把散在地上的紙重新裝進箱子裡之後, 我與他們擦身而過, 聽見妹妹跟哥哥說: 「這樣回去又要被罵了...」 (向媽媽說這件事的時候, 才剛說到 「樓下那家」, 她就說: 「喔~ 他們很早就吃晚餐了啊 [挨打之意]」; 另外當天好像因為社區施工, 不收垃圾和資源回收, 自是後話)

當然, 我認為有問題的角色是「家長」. 可是在外他們家表現的是一個和樂的基督教家庭, 不知道基督教義裡, 這樣的管教方式、行為是否是合適的? 至少我們家在邱小妹事件後, 開始有是否應該報警的疑問出現.

夜歸

事實上要說的都是昨天的事.

昨天凌晨從網路上斷線後, 總覺得自己會睡不著. 總之心情很亂. 幸好當天的練習相當累人, PL 翻沒幾頁就昏昏睡去. 一直到中午醒來, 整個下午覺得自己在崩潰邊緣. 心情很差很差, 只能回去找個從前留下來的秘密角落, 勉強撐著.

四五點的時候情況好了點, 恢復到可以工作了, 於是把前一天弄好的 code commit 上去, 再把暑假翻的一點 Perl 6 essentials 更新和第二版同步. 弄著弄著不小心超過了時間, 遲了半個多小時才去游泳池. 去的時候大家已經在游耐力了, 就在旁邊慢游一陣, 再跟最後幾組. 無奈慢游的量不夠, 肌肉沒放開根本跟不上. 一向運動後心情都會不錯, 所以上岸後照理心情會好點, 不知怎地, 沒好多少. 晚餐有一口沒一口地塞完一晚蓋飯, 再跑去 217.

那時候整個人一定很奇怪. 我覺得自己快倒下去了, 一到 217 大家也說我臉色慘白. 而 217 又在歲修、移機, 整個鬧轟轟的, 只得撐著跟大家聊聊天. 晚點身體好些了, 才幫著做些粗活, 平常練那麼多肌力就是這時候用的.

十二點多整個工程算是結束了, 下一次是過年後的事. 開始和饅頭, MH, wens 天南地北.

終於在三年後, 可以慢慢地把高二剛開始時那段一直不願明講的感情說出來. 接著聊了很多很多事, 時間變得不重要. 很自然地, 話題從這裡轉到那裡. 很多關心, 很多提議, 很多以前不知道的東西, 很多從來不曾有過的想法, 慢慢地在幾個人之間轉來又轉去. 散去時已經是三點半了.

感謝拉飯和他的機車, 把我載到路口. 回到家是四點多, 自然全家都睡了, 雖然根據經驗, 媽一定知道我已經回來了, 明天早上一定會說今天晚上都沒睡好. 但是總之回到家, 到中午前還有七個多小時可以睡. 寫了張字條擺在餐桌上, 就算起床後會被念或被罵, 今天晚上很值得.

謝謝饅頭, 謝謝 MH, 謝謝 wens 也謝謝拉飯. 今天晚上, 我終於敢拿出真正的我, 在大家面前.

星期一, 1月 24, 2005

練泳

耐力感覺有比前幾天好了, 可是還是被說前七十五衝特快, 之後就鳥掉了 orz. 總之從第一組結束就休五十那個 (已經被兩百用了二十多秒), 之後硬撐一百五, 可以:pp
只掉三四秒, 一百就剛好跟到.
超級五百兩個雖然一樣多, 可是出發要轉身時間很不夠, 又要用特殊游法就爆了 @@ 打水這個'量差不多剛剛好, 很累但是不會抽筋.
整體而言感覺水有抓到, 氣和肌力也差不多平衡, 終於有練到的感覺了.

--菜單--
熱身:
|自仰蝶仰仰蛙蛙自 各 25m, 不限時
|自仰 各 25m, 握拳不限時

打水:
|50m * 20, 1 分 5 秒一趟
|第 5, 10, 15 趟夾板
|第 20 趟慢游

超級五百:
|兩組.
||蝶 蝶仰蛙 仰蛙 蝶 蝶 仰蛙
||蝶仰蛙 蝶 仰蛙 蝶 蝶 蝶 蝶
||每個字 25m, 30 秒
||單蝶式出發後蝶腰 15m 出水第一下不換氣, 第二下之後可以換別的式.
||蝶轉仰最後五米不能換氣, 仰式出發盡量仰蝶.

耐力:
|四組
||50m, 50 秒; 150m, 2 分 15 秒;
||100m, 1 分 40 秒; 200m, 3 分.

姿式練習:
|蝶: 三下搖櫓一次蝶, 50m
|蝶: 划手不出水, 自由式打水伸手, 50m
|自: 伸單臂打水, 雙邊喚氣, 左右各一次共 100m

total:
|4250m
|外加慢游, 再跟林蔓儒衝五十自 30 秒, 五十蝶 35 秒..

第一篇部落格

不知道為什麼前陣子 (期末考期間 XD) 忽然覺得自己好像應該弄個 blog 來寫寫. 但是又懶得自己弄一個起來, 就跑來 blogger.com 囉, 反正已經被 google 買下來了, 就當是 gmail 外再多用一個 google 的服務吧 :)

其實打 blog name 的時候還蠻擔心中文會不會爛掉的, 看起來是好的就是了, google 這點倒真的做得不錯 (還是 blogger.com 其實就已經處理好了? 不清楚)

Any way, 我的 blog 開始了.