ORM(Object-Relational Mapping)是將關聯式資料表映射到物件導向資料的抽象化技術
其中最有名的是微軟的Entity Framework
它最大的優勢是只要寫一套LINQ,就能適用各種不同的DB,不需要為了不同DB改寫
且支援DB眾多,舉凡SQL Server、MySQL、Oracle,到PostgreSQL、SQLite等皆可
(當然支援最好的還是微軟自己的SQL Server)
之所以能支援這麼多種類的DB,其實也是靠各家廠商提供的Provider,將LINQ語法轉換而成

蕭雲 發表在 痞客邦 留言(3) 人氣()

2018-07-22 23_35_57-Window.png
最近在SQL Server遇到要複製一個鏡像資料庫的需求(同Server不同名稱)
由於在網路稍微搜尋一下沒有各種方法的比較,加上我很久沒有寫技術文件了
就趁此機會整理一下我知道的方法跟缺點吧
(本篇的圖片擷取至SQL Server Management Studio 17.4,可能跟舊版有一點差異)

蕭雲 發表在 痞客邦 留言(1) 人氣()

install_1
最近使用Visual Studio 2010,嘗試把服務包裝成安裝檔時吃了一點苦頭
為了避免未來再次犯錯,因此記錄一下要注意的地方
希望能幫助有遇到相同情形的網友
(為什麼用VS2010示範,是因為這個安裝工具在VS2012以後就被拿掉了
但最近已經有解,請參考本篇最後一節)

蕭雲 發表在 痞客邦 留言(4) 人氣()

繼上次的ASP.NET使用筆記又過了一年多
本次記錄了ASP.NET MVC與css/js/sql所遇到的問題
希望能幫到發生同樣問題的人
若內容有誤,歡迎網友指正

蕭雲 發表在 痞客邦 留言(2) 人氣()

gridview_row
本篇整理了一些我以前寫ASP.NET遇到的問題
希望能幫助從Java或其他語言跳槽到ASP.NET的人
有新的內容應該會在此篇繼續更新吧
 

蕭雲 發表在 痞客邦 留言(14) 人氣()

Android_1.png
這學期我又修了林老師的嵌入式系統
我們將在Google力推,可在各種手機執行的Android平台學習寫程式
本學期使用Eclipse(日蝕)這個IDE
當然還會加上Android的模擬器
其實這堂課已經上了不少次了
原本是不打算寫筆記的(因為老師的跳躍式教學實在太難記錄)
不過為了以後方便回想,還是花時間做了
只是應該不會每次上課都寫一篇
以後有什麼重大突破才會紀錄吧
《本學期課本》
Professional Android Application Development
這本書很貴,要4X美元
裡面都是蒐集網路上的文章再加一點範例,不一定需要...
《本課程需要軟體》
1. Ubuntu 8.10(其實Windows亦可,以下是在WIndows環境下編的)
2. Java SDK
3. Eclipse
4. Android SDK
5. Android Plug-in
《安裝步驟》
首先請下載Java SDK(JDK)
目前最新版是JDK 6 Update 13
下載完後請照流程安裝,一直按Next即可,在此不截圖
接下來下載Eclipse
Eclipse有多種版本,每個版本包了不同的開發環境(比較表)
因為我們需要Web Tools這個環境
為了節省麻煩,請直接下載最肥的JEE
(用普通的JAVA環境另外裝Web Tools太麻煩了)
Eclipse是免安裝軟體,下載後直接解壓縮到C:\eclipse即可
接著下載Android SDK
目前最新版是Android 1.1 r1
跟Eclipse一樣不用安裝,下載完後建議解壓到C:\android
原本Android SDK的目錄有包含版本號
但這樣每次有新版就必須更改目錄位置
所以建議把目錄後面的版本號刪掉,以後新版直接覆蓋到該目錄即可
解壓縮完android SDK後,還必須改環境變數才行
這個等同於Ubuntu的PATH值
當在終端機輸入一個檔名,除了在該目錄下找
也會在PATH所寫的所有路徑找尋
就像在命令提示字元中不管在哪個目錄
只要打mspaint都可以叫出小畫家一樣
操作:控制台 > 系統 > 進階 > 環境變數
找到底下的Path,按下編輯
然後在後面再補上;C:\android\tools
之後在命令提示字元打上emulator就可以開啟模擬器
另外建議再補上;C:\Program Files\Java\jdk1.6.0_12\bin
這是JDK的bin位置,安裝SDK時好像不會自動幫你增加
以後要取得Private key時會用到
請填入你安裝位置喔,不要照抄上面的字串進去
目前已經把Android SDK裝到C槽,也把它加入系統變數
Eclipse也加到C槽,接著開始設定Android Plug-in
安裝步驟可以參考Android網站
以下是Eclipse 3.4版本的安裝方式
1. 開啟Eclipse,選擇功能表的Help > Software Updates...
2. 選擇Available Software,點選旁邊的Add Site...
3. 打入以下的位置 http://dl-ssl.google.com/android/eclipse/
4. 加入後請勾選剛加入的Development Tools
按下旁邊的Install...按鈕
5. 接下來會要你接受合約,選是然後按Finish
等他下載完後即可安裝完成
《設定Android環境》
雖然剛剛下載過Android SDK,但Eclipse並不知道放哪裡
所以請安裝完上方的發展工具後,重新開啟Eclipse
並選擇Window > Perferences
選左邊的Android標籤,將Android SDK位置填入
至此,所有準備工作都完成了,可以開始測試了
《建立Hello Android專案》
請選擇功能表 File > New > Project
然後選擇Android Project
Project Name是專案名稱
Package Name是套件網址,最好用規定的名稱取名
(不一定要取joe,也可以用自己的英文名)
Activity Name是Class名稱,第一個字要用大寫且不能空格
Application Name是這個程式在Android平台上顯示的名稱
接下來就是開始寫程式了
建議是參考Android網站的介紹
將程式碼改成下圖的樣子
對了,如果不知道該程式碼需要Import什麼的話
只要在該程式碼上按下Ctrl+Shift+O
上方就會自動填入Import了!
不過這樣還不能編譯,還有一步沒有做完
請選擇功能表的Run > Run Configuation
選擇Project的Browse...,選擇此專案
Launch也要選擇(只有一個項目,不會選錯吧)
最後選擇功能表的Run > Run
就可以看到結果了
注意:第一次開啟模擬器時,他會自己設定一些東西,所以會比較久
第二次以後開就不會了
還有程式跑完後不需要關閉模擬器
之後要編譯直接Run即可,不然模擬器還會重新開啟,會比較花時間
要在模擬器直接執行程式的話,可以按下MENU
裡面就有你寫的Hello Android了!

蕭雲 發表在 痞客邦 留言(4) 人氣()

最後一次上課,當然是我們的期末考
其實本來是不想寫這第十六次的筆記的
因為老師將考卷收了回去(沒有比較精確的題目內容)
而且我考的不太好(半題不會寫,大概是80分吧)
不過想說最近都沒更新秉持著貫徹始終的精神,還是把它完成吧
考試形式跟期中考一模一樣
-----
考試時間:約兩個小時
可以翻書、上網,但嚴禁作弊(交談或交換答案等等)
1. 請上網到課程網頁下載 linuxp-final.tar.gz,並將下載的檔案,
解開到自己的目錄下,進入linuxp-final目錄下作答 (10%)
.........這根本就是一個空目錄啊!
我很懷疑如果我自己建一個同名的目錄的話,他分得出來嗎?
2. 撰寫程式f2.c,可以將輸入輸出導向到檔案
例如輸入w > output能將顯示內容導出到檔案output
輸入wc < input可以將檔案input的內容導入到wc
請使用dup、fork、exec  (40%)
看起來很簡單,但是我怎麼寫,輸入導向的部分就是不對
其實當初我就知道一定會考跟作業相關的題目
只是作業的題目是將一個程式的結果傳到另一個程式
而這次改成從檔案讀取
看起來很類似,但我還是只寫對一半,蠻可惜的
唉~這部分我的確是比較弱一點
3. 撰寫程式f3.c,可以從伺服器取得時間並對時
程式可以輸入伺服器位址,若不輸入則預設學校的伺服器 (40%)
這題根本跟作業三一模一樣
把作業檔名改成f3.c,打完收工
4. 將linuxp-final目錄打包成linuxp-final-xxxxxxxx.tar.bz2,其中
xxxxxxxx為你的學號,並上傳至課程網頁(10%)
沒了...?對!就這樣而已,要寫的題目只有兩題
所以我卡在題目二兩個小時 ::>__<::
除非實力已經達到考不倒的境界
不然考試其實很看運氣的
Linux果然不是我的菜...
-----
順便一提,考完後不到一個禮拜,總成績竟然就出來了!
但是課程網頁上還是沒有寫每個人細項的成績
作業沒改,期末考成績也沒有公佈
我好疑惑老師到底是怎麼打成績的啊...

蕭雲 發表在 痞客邦 留言(0) 人氣()

15-01.gif
新年第一篇網誌,竟然是 Linux學習筆記..."orz
這篇也是補兩個禮拜前的課程
由於學校因為聖誕節跟元旦放掉兩個星期四的關係
這篇也是Linux程式設計的最後一堂課的內容
接下來只要考完下禮拜的期末考,本學期就正式結束了︿( ̄︶ ̄)︿
===
ch 15 Sockets
===
沒有socket就沒辦法上網,沒辦法上網就...不好玩了XD
C的socket寫法較複雜,JAVA、.NET都把它包起來了,更好用
‧socket是pipe的延伸
pipe是建立一個通道,藉由通道傳遞我的訊息
任何人只要知道我的pipe檔名,就可以跟其他人做溝通
缺點是pipe只能在本機電腦上
socket是一個機制,允許client跟server溝通
socket跟pipe一樣可以read跟write
而且它還能夠跨越網路
所以process要跟process做溝通,不一定要在同一台電腦上
Windows跟Linux都可以利用Socket跟對方作溝通
我們不用知道對方是什麼系統就可以做溝通
這都是socket的功勞
Windows的Socket規格稱為WinSock
socket連線步驟
1. 通常server的應用程式需要先產生socket,使用system call socket
2. 然後要給socket一個名字(port 80)
(port理論上只有65000多個)
3. socket取名稱做systen call bind
4. server會等待client連線
5. system call listen,並產生一個queue讓client連線
6. 系統可以system call accept來允許連線
更詳細的訊息,請參考man socket
‧關鍵字前面為AF_代表為address family
PF_為protocol family
PF_UNIX跟PF_LOCAL不是跨越網路,而是在檔案系統溝通
PF_INET使用IPv4的網路協定
PF_INET6當然就是使用IPv6的協定了
請參考
man 7 unix - 看socket的詳細結構
man 7 ip - ipv4的通訊協定
‧client1 & server1
跟上次pipe類似,但稍有不同
如果先執行./client1會顯示找不到檔案
要先執行./server1
此時可以輸入ll *sock*來看一下socket的存在
發現有產生後,再執行./client1才會看到正確的結果
順便一提,結束掉server1後,socket還是存在喔
請用rm *sock*清空
‧socket的語法
sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

蕭雲 發表在 痞客邦 留言(3) 人氣()

14-01.gif
這篇是補兩個禮拜前的筆記
雖然寫這個筆記一直遭到家人的反對,認為不該浪費時間在這
但我還是覺得應該要把它給寫完
既然決定了,那就一定要做到最好
===
ch 13  Pipes
===
因為老師每個禮拜都會有些內容與上禮拜重複
所以重複的內容我就不再截圖了
‧以前的linux每個指令都是一個檔案
但要如何讓檔案代表該裝置?用mknod、mkfifo都可以
‧/tmp目錄是每個人都可以寫入的
‧上課提到了網路喚醒技術(Wake-on-LAN)
跟RFC(request for comments)的相關介紹
‧本次上課第一個範例是建立pipe(這個上次不是上過了?)
pipe是管線,有兩端,一端是寫資料,一端是讀資料
‧輸入法跟程式是利用socket溝通
ls->屬性s是屬於socket(其實這寫過三遍了吧)
‧用fifo傳訊息範例
先用mkfifo myfifo建立fifo
然後輸入echo hello world > myfifo
再用另一視窗輸入cat myfifo
就能把訊息傳過去了
後面加&代表在背景作業(請看上次介紹)
‧如果先輸入cat myfifo的話會被block住
因為沒有讀到東西
‧echo的內容輸入
echo hello again\
second line\
third line
事實上這樣是一行不是三行
‧fifo1
建立fifo,可以修改成自己的fifo
‧fifo2
執行要加參數要不要read、write、nonblock(不要block直接回來)
如果直接執行會說需要參數
範例:./fifo2 O_RDONLY O_NONBLOCK &
範例:./fifo2 O_WRONLY
‧apropos fifo - 可以查man的說明中,哪些東西跟fifo有關
查到了,我們這次需要看的是man 4 fifo
‧fifo3 & fifo4
fifo3是傳個10MB的資料
fifo4是收個10MB的資料
傳10MB資料過去不用一秒就可以結束了,速度超快...
‧client & server
一邊輸入./server &
另一邊輸入
for i in 1 2 3 4 5
do
./client &
done
讓他連跑五次client程式
此時輸入ll /tmp/*fifo可以看到產生很多的fifo
但是結束後fifo就消失了
‧ins ntp - 安裝 ntp,這是一個對時軟體
ntp對時準確度可以到0.233 nanoseconds
‧ntpdate 網址 - 可連到後面的網址作對時
不過執行後卻出現the NTP socket is in use, exiting
因為NTP程式已經開啟了,所以不需要再上網對時一次
因此我們先用/etc/init.d/ntp stop把NTP關了
再次輸入就可以成功對時了.....
可是因為在家連不到學校伺服器
所以底下的截圖是顯示錯誤...
也可以使用中華電信對時網址 clock.hinet.net
‧date 11220304 - 後面輸入數字可以更改時間(?)
不過我實際上看並沒有被更改,只會顯示你輸入的時間
‧最後一次作業原本是程式之間互相傳遞訊息
改成用網路對時比較簡單
‧作業可以參考NTP的程式碼
一樣記得先用sudo bash轉成root權限
apt-get source ntpdate
cd ntp-4.2.4p4+dfsg/
ntpdate的程式碼非常龐大,因為它必須考慮到很多狀況
如果想搜尋目錄底下所有的*.c跟*.h,可以用
find . -name '*.[ch]'
===
ch 12 Thread
===
在一個程式當中可以有很多條線同時執行,稱為Thread
Windows工作管理員中 [檢視] - [選擇欄位]
加入"執行緒計數"可以看到一個程式用了多少的thread
如IE就用了32個Thread
thread有自己的stack
所以local variables(區域變數)是不一樣的
但是其shares global variables(全域變數), file descriptors,
signal handlers, current directory state就相同
當輸入是一個thread,處理是一個thread
好處是使用者輸入的時候不會因為處理其他事情而覺得程式沒有回應或很慢
目前的CPU大多是多核心的
如果程式寫多thread,那麼程式執行理論上來講會快
另外一個優點是作業系統從一個thread切換到另一個thread
所需的overlap比process切換少
‧thread1
errno都是共用的
fputs也是用同一個buffer output
編譯時因為用到thread,所以一定要加上-D_REENTRANT跟-lpthread
不加的話程式無法編譯成功
範例:gcc -D_REENTRANT -o thread1a thread1a.c -lpthread
-D_REENTRANT - 可重入,為了程式穩定性最好加
其實makefile也有加這行
 
‧thread3a
thread在很多情況會有不同結果
而且很難debug
不過這個範例我忘了會有哪裡出錯了...
----
補充:台灣用的是通用拼音,大陸用漢語拼音
捷運站也是用漢語拼音

蕭雲 發表在 痞客邦 留言(0) 人氣()

13_01.gif
嗯...又過了一個禮拜沒發文的日子
雖然這並不是最久的一次(以前還有一個月只發文五篇的記錄)
但隔這麼久發文,還真是不自在~"~
這篇筆記是補上上禮拜的課程
這禮拜四上完,之後連放兩次假,接著就要開始期末考了
星期四的課真是吃虧...
‧pipe要fork process(複製一個程序)
需要的resource較多,一般不建議使用pipe open/close
‧老師常用的文字編輯軟體
1. PnotePad
2. SciTE - 特點是可以直接執行PHP程式,只要按下[Tools]-[Go]
我個人比較喜歡用PsPad啦,雖然真的會用到的時機不多
記事本就很好用了
‧uname -a - 顯示Linux版本資訊
‧任何時間寫入file_descriptor[1]的資料可以從file_descriptor[0]讀回來
‧pipe1
這是簡單的pipe範例
使用pipe記得要先引用#include <unistd.h>
順便一提,如果把file_pipes的0跟1互換,會寫入-1 bytes
但是不會顯示出錯誤
‧pipe2
看起來結果一樣,但其實這個程式是由父process寫入,子process讀取
我稍微修改了範例,使用getpid()顯示process id即可看出差異
‧pipe3
顯示出file_pipes可以看到
讀取資料是從fd 3,寫入資料則是fd 4(fd = file descriptor)
因為fd 0、1、2被用掉了,所以新的從3、4開始用
0、1、2是標準輸入、標準輸出、標準錯誤
‧在程式裡執行其他程式的語法
execl(執行程式檔, 給他的名字, 傳過去的fd, Null pointer);
最後一個一定要給他null pointer喔
‧如果pipe在不同process必須分別處理他,很麻煩
dup - 電腦給你目前最小可以用的fd
dup2 - 我自己給你最小的fd
‧pipe5
Ln21: close(0);  關掉標準輸入
Ln22: dup(file_pipes[0]); - 給他目前最小的可以用的file descriptor
原本應該要從鍵盤去讀取的
‧輸入/dev;ll
發現權限的第一個字母是c,代表他是字元設備
其他代表 d:目錄、s:socket、p:pipe
(好像寫過很多次這個了)
‧fifo1
產生pipe檔案,成功就回傳0
語法:mkfifo my_fifo(my_fifo是你想要取的檔名)
程式的執行方法:
先輸入cat < /tmp/my_fifo
他會將畫面停在那個地方
再到另一視窗輸入echo "Hello World" > /tmp/my_fifo
第一個視窗就會讀到字串了
如果在程式後面加上&,代表他是在背景執行
範例:cat < /tmp/my_fifo &
背景代表它會在記憶體內自行運行,無法直接控制它
除非用bg/fg等指令把它叫出來
詳細說明可以參考鳥哥的Linux私房菜關於&的介紹
‧jobs - 顯示目前有什麼程式在背景執行
如果沒有的話會什麼都不顯示
‧server & client
先輸入./server &讓他在背景執行
到另一個畫面輸入以下內容
for i in 1 2 3 4 5
do
./client &
done
它會自動執行五次,如下圖產生了5484~5488五個process
但是最後顯示出來的結果並不是照這個順序傳回來的
所以這個範例只是要告訴你...他不會照順序傳回來orz
第二次作業雖然我在打這篇的時候已經截止一個禮拜了
但還是稍微說一下要怎麼做
1. 用gets之類的語法讓使用者輸入指令
2. 找出|(管線),並將token分成左右兩邊
3. 產生pipe,再用fork將這個process一分為二
4. 父親把標準輸出關掉,執行左邊程式並dup給兒子
5. 兒子把標準輸入關掉,執行右邊程式並接收父親的訊息
第一點應該也可以改用程式後面接參數的方式
比方說./hw2 w "|" wc這樣
但|為什麼要用雙引號""包起來呢?
因為如果不包的話,它會把|當成是真的管線而不是一個參數

蕭雲 發表在 痞客邦 留言(0) 人氣()

12-01.gif
竟然一個禮拜沒有寫網誌,我最近果然是太忙了=__=
這篇筆記也是拖了超過一個禮拜
原因是這次的課程內容越來越難,也越來越聽不懂
不知道該寫什麼才好...
接續第十一章的Process
‧pipeopen非最好方式,建議用dup
‧Makefile預設的編譯指令為cc
在Makefile中加一行CC = gcc可改用gcc編譯,聽說效果會比較好
‧system1、pexec老師上次已經講過了,不再重寫一遍
‧fork1
老師小改了裡面的程式碼為fork1a.c
多了顯示pid跟ppid數值
至於這有什麼用,老實說我忘了╮( ̄▽ ̄")╭
‧第二次作業可用exec,效果是運行某個Process並且不再返回
可輸入man exec查看關於他的說明
excelp的p代表path
excelv的v代表vector
‧pexec
因為不再返回,原本最後應該顯示done字樣沒有出來
如果把execlp改成execl,done就會出來了
因為那一行錯誤了......
老師將pexec修改,存成pexec1.c
分別是各種不同的execl的結果,請自行切換註解觀看
如下圖就是錯誤的畫面
想要顯示錯誤訊息的話,先#include <errno.h>
然後用變數errno顯示錯誤代碼,strerror(errno)顯示錯誤訊息
‧想知道某個系統指令放在哪裡的話,請打which
如which ps就會顯示放在/bin/ps
‧wait
講了一堆有的沒的疆屍...
修改wait.c成wait1.c
在程式中間加上system("ps ef");
狀態會顯示Z+,代表這個process目前是疆屍狀態(Zombine)
等到父親結束,兒子才會真正結束
wait完再顯示ps ef,發現就沒有zombine了
※如果在Xubuntu複製的東西無法貼到Windows的話
先在Windows隨便複製一個東西就可以了
‧upper
./upper < file.txt > aa - 將file.txt變大寫再輸出到aa
‧useupper
此程式其實只是把屬性傳到上面的upper這個程式而已
請自行參考程式碼
‧cat - >aaa - 將螢幕上輸入的字輸出到檔案中
-是標準輸入,cat -並不是開啟-這個檔案
而是可以在螢幕上打字輸入內容
缺點是不能回去修改上一行
結束輸入直接按Ctrl+C即可
===
ch 13 Pipes 管線
===
‧popen1
執行指令uname -a產生pipe,先把buffer清成0
將內容讀到read_fp,再用printf印出來
‧popen2
將寫出去的字串讓b程式去讀,此範例是呼叫od -c
‧od - 將檔案用八進位方式顯示
範例:od popen1.c
od -c popen1.c - 秀字元
‧xxd - 跟od類似,只是是以十六進位方式顯示
xxd -g 1 popen1.c - 以多少字元為一組
下圖就是每個字元都分開的樣子
也可以直接執行od跟xxd
在螢幕上打完字後,用Ctrl+D結束輸入
他會將你所打的字用八或十六進位顯示結果
第二次作業寫法跟pipe5類似,記得要參考

蕭雲 發表在 痞客邦 留言(2) 人氣()

11-01.gif
這篇是上星期的上課內容,我又拖了超過一個禮拜
因為不知為何這次上課速度非常快,教的東西又很雜
而我又很懶(毆)
不過不能再拖了,因為我現在能做的也只有讀書了
===
ch 10 除錯(Debugging)
===
《錯誤的種類》
Specification errors - 模型錯誤(如漏掉變數)
design error - 設計錯誤(沒有做好規劃)
coding error - 程式錯誤(寫程式寫錯了)
  -> dry running - 把所有組合放進去測試
我們這次要來學習使用electric fence來除錯
一般應該要先打upd更新軟體清單
不過因為這套軟體幾乎都不更新
所以可以直接輸入ins electric-fence安裝
(記得安裝軟體要先切換root權限)
‧debug1
執行完卻發現什麼東西都沒有顯示,不知道他有沒有錯
輸入diff debug1.c debug2.c比較一下兩個範例
原來debug2多了顯示出來的程式碼
 
‧debug2
顯示了sort完的結果,不過答案是錯的...
因為系統一次給你一個block
‧debug3
比較一下就知道,差別在data直接給他4k記憶體
《修改系統語言為英文》
輸入以下指令
export LC_ALL='POSIX' - 全部改成POSIX
export LANG="C"
輸入locale看設定有沒有被改掉吧
《Debug相關語法》
‧DEBUG mode才做
用#ifdef DEBUG跟#endif將程式包起來
#ifdef DEBUG
printf(“variable x has value = %d\n”, x);
#endif
‧程式執行時給他debug值(1~7)
#define BASIC_DEBUG 1
#define EXTRA_DEBUG 2
#define SUPER_DEBUG 4 - 超詳細的錯誤內容
#if (DEBUG & EXTRA_DEBUG) //如果是Extra Debug才顯示
printf...
#endif
‧如果沒有debug值就給他0
#ifndef DEBUG
#define DEBUG 0
#endif
‧如果覺得每次修改完都要重新compile很麻煩
改成這樣即可
if (debug) {
    sprintf(msg, ...)
    write_debug(msg)
}
記得編譯時加上-DDEBUG參數,才是真的在DEBUG喔
《用gdb來Debug》
Segmentation fault是記憶體配置問題,通常發生在pointer身上
輸入gdb debug3開始偵錯
以下是在gdb模式下的指令
‧help - 顯示所有說明
註:用Ctrl+L可將畫面消掉
‧run - 開始執行程式,發現第23行有問題
‧backtrace - 查看函數呼叫堆疊
‧print j - 顯示變數j內容
‧print a[$-1].key - $指的是上一次最後的值
‧list - 把目前中斷的點放在中間
再輸入list會繼續往下看
‧list 10 - 把第十行放在中間
‧quit - 離開
問題出在 j=4
printf a[4]  正確
printf a[5]  錯誤
所以問題出在5超過範圍(原來是超基本的錯誤...)
‧debug4
可以顯示但是結果還是錯了
‧break 20 - 設中斷點停在第20行
‧print a[0]@5 - 顯示陣列下五個內容
‧display a[0]@5 - 每次碰到中斷點就做後面的事
‧cont - 繼續執行
還不懂的話可以輸入info display、info break查看說明
寫了這麼多,請讓我說句中肯的話,一句就好
以上都是怪胎用的,深受古代程式餘毒
現在都21世紀了,誰還會慢慢輸入中斷點用這種方式debug啊
請改用CodeBlock(其實我比較喜歡輕巧的dev-c++)
《用CodeBlock來Debug》
先開啟empty專案
開啟完後,在專案上按右鍵選擇Add files...
增加ch10/debug4.c這個檔案
並請在Debug跟Release的按鈕上打勾再按OK
先編譯,然後在21行設定中斷點(行號上按一下出現紅點即可)
選擇功能表的[debug]-[debuggubg windows]-[watch]
開啟Debug視窗,可以看變數內容
選擇[debug]-[start]來用debug模式執行
不過因為那時候老師也是弄的2266...所以也弄不出什麼好的東西
我放棄用CodeBlock來偵錯了...orz
《其他Debug工具》
‧Lint
會詳細跟你說程式可能會有什麼問題
ins splint - 安裝lint
splint debug3.c - 執行方式
‧ctags
產生原始碼每個tag(函數或變數名)的所在位置
執行後會產生tags這個檔案,可參考每一個tag的資訊
不過好像只支援vim這個編輯器...
apt-cache search ctags - 如果你不知道ctags的安裝名稱,請先搜尋
ins exuberant-ctags - 安裝ctags
ctags *.c - 目錄下產生一個tags檔案
cat tags - 看其內容
老實說我覺得不是很好用...
‧chref
其實我不知道他是要幹嘛的,老師沒有說清楚
好像跟上面那個程式差不多
dpkg-reconfigure cxref - 第一次執行請先讓他自動設定
cxref *.c - 執行
‧cflow
分析你的程式,看程式那個地方花多少時間
gcc -pg -o debug4 debug4.c - 編譯
./debug4 - 執行程式後目錄下會產生gmon.out
gprof debug4 gmon.out -p - 產生統計表
gprof debug4 gmon.out -q - 產生相關聯的呼叫
《其他範例教學》
‧assert
原始碼內有一段
assert(x >= 0.0);
代表x沒達成>=0的條件就會印出訊息
編譯時多加Don't debug
gcc -o assert -DNDEBUG assert.c -lm
assert部分就不會執行,不用把assert砍掉
‧efence
gcc -o efence efence.c
./efence
不會顯示任何問題,但其實有問題
gcc -o efence efence.c -lefence
./efence
改用此行編譯再執行就會發現問題
‧checker
去執行也看似沒問題
apt-get install valgrind
valgrind --leak-check=yes -v ./checker
應該就會出現問題了(我懶的試了=__=)
===
ch 11 程序(Process)
===
ps - 可以顯示目前的東西
pstree - 樹狀顯示
pstree -p - 加上process id
ps -l 跟ls -l一樣會顯示很多資訊
ps -ef - 會發現所有程式都是由init產生的
他是所有程式的祖先
ps aux - 目前所有process的狀態是什麼
oclock & - 執行oclock這個程式
nice oclock & - 加了nice代表讓他在背景執行
‧diff system1.c system2.c
system1跟system2差別只在一個會等他跑完一個不會罷了
system1加上以下幾行
    int pid;
    pid = getpid();
    printf("My pid=%d\n",pid);
執行時有看到process id,程式執行完就沒了
‧pexec
一樣加上以下幾行,但printf那一行在前頭跟後面都加上來測試
    int pid;
    pid = getpid();
    printf("My pid=%d\n",pid);
執行後卻發現最後那個printf沒有顯示出來
因為pexec會把自己的process蓋掉
所以後面的成事都做不到了
‧fork
簡單講就是把自己一分為二(複製一份自己),下次上課有較詳細的內容
三個禮拜之後要交作業
其實作業最簡單的話只要寫三行就好
char cmd[256];
gets(cmd);
system(cmd);
不過老師規定不可以用system要用fork
請搜尋man exec、man fork、man dup查看說明

蕭雲 發表在 痞客邦 留言(4) 人氣()

1 2
Blog Stats
⚠️

成人內容提醒

本部落格內容僅限年滿十八歲者瀏覽。
若您未滿十八歲,請立即離開。

已滿十八歲者,亦請勿將內容提供給未成年人士。