身為一個查甫郎,我絕對要言出必行,

不能說在facebook嘴砲上說我要寫不拉格,事實上還是直接跑去睡…

來寫一下今天困擾我一個下午的事情好了,為了不損害公司權益,所以部份的資料我會用馬賽克加以掩蓋,看不懂的部份,就先跳過。

先來講我弄很久的gdb remote debug好了,標準的流程在gdb的manual寫得清楚,但是我為了要充點篇幅,這邊還是要按表操課再來一次。

為了方便起見,我們先在這邊定義一些名詞,如host指的是你的x86電腦(也可以是powerpc啦,沒說不行),而target就是你要debug的板子(當然也可以是你的另一台x86電腦)。target跑的是gdb server,而host跑的是gdbclient。我就在我的x86上用pc toolchain & 板子的toolchain做好了gdb,然後把它copy到板子的flash上去,以下記為/usr/bin/gdbserver。假設你的板子的ip是192.168.1.123,在target上啟動gdbserver

# 我要開在tcp port 9000,並且啟動superd這個程式。

# /usr/bin/gdbserver :9000 superd

然後他就會出一點訊息,像是說已經準備好在9000 port聽連結了,gdbserver就會把它自己卡住,等你的gdb client連進來。

接下來在host啟動client

# /usr/bin/gdb

> file /home/jimmy899/app/superd/src/superd

> target remote 192.168.1.123:9000

正常來說,它就會連到你的gdbserver,並且開始gdb的debug動作,可以先按輸入

> b main

> c

讓它在開始之前就先卡住讓你看一下。你也可以趁這個時間看一下你的程式的symbol是不是有正確的load進來,不要像我一樣,傻傻的等它當掉,然後發現symbol是沒load好的… 如果沒load好的話,那就要先檢查一下你的程式在compile的時候是不是有加-g這個flag,像我就笨笨的弄半天,它還是跟我說superd的main只能顯示assembly...最後經同事指點,我才發現原來我少了一個-g。後來我發現還是有一些symbol show不出來,像是在gdb client下control-c,它也只是很白痴的停下來,然後顯示

??? (unknown symbol)

bt,也是秀

#0 ???

而已。後來就不了了之了,最後我同事建議我用printf… 我說要print到什麼時候啊… 它要跑很久耶…跑了幾分鐘,它就當了,所以printf就讓我找到當掉的點了。printf果然是比gdb強大啊 = =

當掉的點很白痴。本來我是把一個函式的結果值tuple放在 d->stmt 裡面,

但是後來結果值的項目變多了,所以d->stmt裡面是放indicator_t的資料。不過我有一行舊code是做這樣的事

memcpy(tuple, d->stmt, sizeof(db_tbl_account_tuple_t));

程式在大部份的時候都沒事,但是有時候就會死掉。

我把它移掉,現在正在壓力測試中…

創作者介紹
創作者 荒廢的記事本 的頭像
jimmy899

荒廢的記事本

jimmy899 發表在 痞客邦 留言(0) 人氣( 434 )