1.下載go的windows下的安裝包:
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、永泰ssl等。為1000多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的永泰網(wǎng)站制作公司
也可以下載源代碼,用MinGW編譯。先配置好MinGW的環(huán)境,再運(yùn)行all.bat即可。
MingW:
2.下載gocode,用于go的補(bǔ)全提示:
gocode 的github地址:
要安裝git,在windows下,通常用msysgit。
再在cmd下安裝:
go get -u github點(diǎn)抗 /nsf/gocode
也可以下載代碼,直接用go build來(lái)編譯,會(huì)生成gocode.exe。
3.在eclipse中安裝插件:
4.配置插件:
(1).配置go的編譯器
(2).配置gocode(可選),這里我用的是eclipse插件自帶的gocode。
(3).配置gdb,做調(diào)試用(可選)
如果安裝了MingW,可以在安裝目錄下找到gdb。
5.測(cè)試是否成功
新建一個(gè)go工程,再建立一個(gè)hello.go。如下圖:
gdb調(diào)試如下(要在console中用輸入命令來(lái)調(diào)試):
6.其它
2012年3月31日:
目前這個(gè)eclipse插件,只能把代碼放在cmd包中才能運(yùn)行。
貌似現(xiàn)在流行的是Sublime Text2 + gocode。Sublime Text也的確比較好用。
======================
Eclipse平臺(tái)下配置Go語(yǔ)言開(kāi)發(fā)環(huán)境(Win7)
《Go語(yǔ)言編程》中寫(xiě)到:“從功能和易用性等方面考慮, Eclipse+GoEclipse、LiteIDE這兩個(gè)環(huán)境在所有IDE里面是表現(xiàn)最好的”,所以筆者打算采用Eclipse+GoEclipse開(kāi)發(fā)環(huán)境。
Eclipse平臺(tái)下配置Go語(yǔ)言開(kāi)發(fā)環(huán)境步驟:
1、安裝JDK和Eclipse
建議JDK1.6及以上版本。Eclipse3.6及以上版本。
2、安裝GoEclipse插件
在Eclipse中點(diǎn)擊菜單“Help”-》“Install New Software”打開(kāi)如下對(duì)話框,添加go插件的安裝地址:,
按提示一步一步操作即可,下載時(shí)可能會(huì)遇到網(wǎng)絡(luò)問(wèn)題,可使用goagent或其他代理。
3、安裝并配置Go的編譯器
下載地址:
下載時(shí)請(qǐng)注意版本,應(yīng)選擇windows-386的版本。
安裝完后重啟Eclipse,并通過(guò)菜單項(xiàng)“Window”-》“Preferences”-》“Go”打開(kāi)Go語(yǔ)言的配置選項(xiàng)框。如下圖:
選擇Go的安裝路徑即可,如筆者的安裝路徑是F:\Work\Go
4、配置調(diào)試器(可選)
需要先安裝MinGW,下載地址:
安裝完之后,通過(guò)菜單項(xiàng)“Window”-》“Preferences”-》“Go”-》“Debugger”打開(kāi)調(diào)試器的配置選項(xiàng)框。
將GDB路徑配置為:MinGW安裝目錄下的gdb.exe文件即可。
5、配置代碼自動(dòng)補(bǔ)全(可選)
需要配置gocode,可使用goEclipse插件自帶的版本,也可以自己下載:
筆者使用的是goEclipse插件自帶的版本,配置方式如下:
通過(guò)菜單項(xiàng)“Window”-》“Preferences”-》“Go”-》“Gocode”打開(kāi)配置選項(xiàng)框。
將Gocode的路徑配置為:goEclipse的安裝路徑下的gocode.exe文件,如
F:\Work\eclipse\plugins\com.googlecode.goclipse.gocode_0.7.6.v450\tools\windows_386\gocode.exe
6、配置支持Import遠(yuǎn)程包(可選)
為了支持Import遠(yuǎn)程包,最好裝個(gè)gowin-env。下載地址:。 如果下的是壓縮包,請(qǐng)把它解壓到C盤(pán)。例如,C:\gowin-env。里面有個(gè)Console.bat是以后使用go get的環(huán)境。舉例:有個(gè)文件a.go,里面import?(
"fmt"
"github點(diǎn)抗 /astaxie/beedb"
_?"github點(diǎn)抗 /ziutek/mymysql/godrv"
為了編譯該a.go文件,需要啟動(dòng)Console.bat,然后在該命令行窗口,進(jìn)入c:\go\src目錄下,執(zhí)行g(shù)o getgithub點(diǎn)抗 /astaxie/beedb
Go get github點(diǎn)抗 /ziutek/mymysql/godrv .
Go?會(huì)自動(dòng)下載該遠(yuǎn)程包并編譯和安裝這些包。
7、go install: no install location for directory *** outside GOPATH錯(cuò)誤的處理
由于每一個(gè)Go程序都必須包含一個(gè)main包以及一個(gè)main()函數(shù),因此如果沒(méi)有main包就會(huì)導(dǎo)致上述錯(cuò)誤。
What Doesn't Kill Me Makes Me Stronger
1: 對(duì)于在應(yīng)用程序中加入?yún)?shù)進(jìn)行調(diào)試的方法:
直接用 gdb app -p1 -p2 這樣進(jìn)行調(diào)試是不行的。
需要像以下這樣使用:
#gdb app
(gdb) r -p1 -p2
或者在運(yùn)行run命令前使用set args命令:
(gdb) set args p1 p2
可以用show args 命令來(lái)查看
2. 加入斷點(diǎn):
break linenumber
break funcName
break +offset
break -offset
(在當(dāng)前行號(hào)的前面或后面的offset行停住。)
break filename:linenum
在源文件filename的linenum行處停住。
break filename:function
在源文件filename的function函數(shù)的入口處停住。
break ... if
...可以是上述的參數(shù),condition表示條件,在條件成立時(shí)停住。比如在循環(huán)境體中,可以設(shè)置 break if i=100,表示當(dāng)i為100時(shí)停住程序。
3. 查看運(yùn)行時(shí)的堆棧:
使用bt命令
4. 打印某個(gè)變量的值:
print val
5. 單步: n
繼續(xù)運(yùn)行: c
step
單步跟蹤,如果有函數(shù)調(diào)用,他會(huì)進(jìn)入該函數(shù)。
next
同樣單步跟蹤,如果有函數(shù)調(diào)用,他不會(huì)進(jìn)入該函數(shù)。很像VC等工具中的step over。后面可以加count也可以不加,不加表示一條條地執(zhí)行,加表示執(zhí)行后面的count條指令,然后再停住。
set step-mode
set step-mode on
打開(kāi)step-mode模式,于是,在進(jìn)行單步跟蹤時(shí),程序不會(huì)因?yàn)闆](méi)有debug信息而不停住。這個(gè)參數(shù)有很利于查看機(jī)器碼。
set step-mod off
關(guān)閉step-mode模式。
finish
運(yùn)行程序,直到當(dāng)前函數(shù)完成返回。并打印函數(shù)返回時(shí)的堆棧地址和返回值及參數(shù)值等信息。
until 或 u
當(dāng)你厭倦了在一個(gè)循環(huán)體內(nèi)單步跟蹤時(shí),這個(gè)命令可以運(yùn)行程序直到退出循環(huán)體。
6.在GDB中執(zhí)行shell命令:
在gdb環(huán)境中,你可以執(zhí)行UNIX的shell的命令,使用gdb的shell命令來(lái)完成:
eg. shell make
7. 運(yùn)行環(huán)境
可設(shè)定程序的運(yùn)行路徑。
show paths 查看程序的運(yùn)行路徑。
set environment varname [=value] 設(shè)置環(huán)境變量。如:set env USER=hchen
show environment [varname] 查看環(huán)境變量。
8.觀察點(diǎn)(WatchPoint)
觀察點(diǎn)一般來(lái)觀察某個(gè)表達(dá)式(變量也是一種表達(dá)式)的值是否有變化了,如果有變化,馬上停住程 序。我們有下面的幾種方法來(lái)設(shè)置觀察點(diǎn):
watch
為表達(dá)式(變量)expr設(shè)置一個(gè)觀察點(diǎn)。一量表達(dá)式值有變化時(shí),馬上停住程序。
rwatch
當(dāng)表達(dá)式(變量)expr被讀時(shí),停住程序。
awatch
當(dāng)表達(dá)式(變量)的值被讀或被寫(xiě)時(shí),停住程序。
info watchpoints
列出當(dāng)前所設(shè)置了的所有觀察點(diǎn)。
9. 維護(hù)breakpoint
clear
清除所有的已定義的停止點(diǎn)。
clear func
清除所有設(shè)置在函數(shù)上的停止點(diǎn)。
delete [breakpoints] [range...]
刪除指定的斷點(diǎn),breakpoints為斷點(diǎn)號(hào)。如果不指定斷點(diǎn)號(hào),則表示刪除所有的斷點(diǎn)。range 表示斷點(diǎn)號(hào)的范圍(如:3-7)。其簡(jiǎn)寫(xiě)命令為d。
比刪除更好的一種方法是disable停止點(diǎn),disable了的停止點(diǎn),GDB不會(huì)刪除,當(dāng)你還需要時(shí),enable即可,就好像回收站一樣。
disable [breakpoints] [range...]
disable所指定的停止點(diǎn),breakpoints為停止點(diǎn)號(hào)。如果什么都不指定,表示disable所有的停止 點(diǎn)。簡(jiǎn)寫(xiě)命令是dis.
enable [breakpoints] [range...]
enable所指定的停止點(diǎn),breakpoints為停止點(diǎn)號(hào)。
10、程序變量
查看文件中某變量的值:
file::variable
function::variable
可以通過(guò)這種形式指定你所想查看的變量,是哪個(gè)文件中的或是哪個(gè)函數(shù)中的。例如,查看文件f2.c中的全局變量x的值:
gdb) p 'f2.c'::x
查看數(shù)組的值
有時(shí)候,你需要查看一段連續(xù)的內(nèi)存空間的值。比如數(shù)組的一段,或是動(dòng)態(tài)分配的數(shù)據(jù)的大小。你可以使用GDB的“@”操作符,“@”的左邊是第一個(gè)內(nèi)存的地址的值,“@”的右邊則你你想查看內(nèi)存的長(zhǎng)度。例如,你的程序中有這樣的語(yǔ)句:
int *array = (int *) malloc (len * sizeof (int));
于是,在GDB調(diào)試過(guò)程中,你可以以如下命令顯示出這個(gè)動(dòng)態(tài)數(shù)組的取值:
p *array@len
如果是靜態(tài)數(shù)組的話,可以直接用print數(shù)組名,就可以顯示數(shù)組中所有數(shù)據(jù)的內(nèi)容了。
11.輸出格式
一般來(lái)說(shuō),GDB會(huì)根據(jù)變量的類型輸出變量的值。但你也可以自定義GDB的輸出的格式。例如,你想輸出一個(gè)整數(shù)的十六進(jìn)制,或是二進(jìn)制來(lái)查看這個(gè)整型變量的中的位的情況。要做到這樣,你可以使用GDB的數(shù)據(jù)顯示格式:
x 按十六進(jìn)制格式顯示變量。
d 按十進(jìn)制格式顯示變量。
u 按十六進(jìn)制格式顯示無(wú)符號(hào)整型。
o 按八進(jìn)制格式顯示變量。
t 按二進(jìn)制格式顯示變量。
a 按十六進(jìn)制格式顯示變量。
c 按字符格式顯示變量。
f 按浮點(diǎn)數(shù)格式顯示變量。
(gdb) p i
$21 = 101
(gdb) p/a i
$22 = 0x65
(gdb) p/c i
$23 = 101 'e'
(gdb) p/f i
$24 = 1.41531145e-43
(gdb) p/x i
$25 = 0x65
(gdb) p/t i
$26 = 1100101
11.查看內(nèi)存
使用examine命令(簡(jiǎn)寫(xiě)是x)來(lái)查看內(nèi)存地址中的值。x命令的語(yǔ)法如下所示:
x/
n、f、u是可選的參數(shù)。
n 是一個(gè)正整數(shù),表示顯示內(nèi)存的長(zhǎng)度,也就是說(shuō)從當(dāng)前地址向后顯示幾個(gè)地址的內(nèi)容。
f 表示顯示的格式,參見(jiàn)上面。如果地址所指的是字符串,那么格式可以是s,如果地十是指令地址,那么格式可以是i。
u 表示從當(dāng)前地址往后請(qǐng)求的字節(jié)數(shù),如果不指定的話,GDB默認(rèn)是4個(gè)bytes。u參數(shù)可以用下面的字符來(lái)代替,b表示單字節(jié),h表示雙字節(jié),w表示四字節(jié),g表示八字節(jié)。當(dāng)我們指定了字節(jié)長(zhǎng)度后,GDB會(huì)從指內(nèi)存定的內(nèi)存地址開(kāi)始,讀寫(xiě)指定字節(jié),并把其當(dāng)作一個(gè)值取出來(lái)。
n/f/u三個(gè)參數(shù)可以一起使用。例如:
命令:x/3uh 0x54320 表示,從內(nèi)存地址0x54320讀取內(nèi)容,h表示以雙字節(jié)為一個(gè)單位,3表示三個(gè)單位,u表示按十六進(jìn)制顯示。
12.自動(dòng)顯示
你可以設(shè)置一些自動(dòng)顯示的變量,當(dāng)程序停住時(shí),或是在你單步跟蹤時(shí),這些變量會(huì)自動(dòng)顯示。相關(guān)的GDB命令是display。
display
display/
display/ expr
expr是一個(gè)表達(dá)式,fmt表示顯示的格式,addr表示內(nèi)存地址,當(dāng)你用display設(shè)定好了一個(gè)或多個(gè)表達(dá)式后,只要你的程序被停下來(lái),GDB會(huì)自動(dòng)顯示你所設(shè)置的這些表達(dá)式的值。
格式i和s同樣被display支持,一個(gè)非常有用的命令是:
display/i $pc
undisplay
delete display
刪除自動(dòng)顯示,dnums意為所設(shè)置好了的自動(dòng)顯式的編號(hào)。
disable display
enable display
disable和enalbe不刪除自動(dòng)顯示的設(shè)置,而只是讓其失效和恢復(fù)。
info display
查看display設(shè)置的自動(dòng)顯示的信息。GDB會(huì)打出一張表格,向你報(bào)告當(dāng)然調(diào)試中設(shè)置了多少個(gè)自動(dòng)顯示設(shè)置,其中包括,設(shè)置的編號(hào),表達(dá)式,是否enable。
13. 設(shè)置顯示選項(xiàng)
set print address
set print address on
打開(kāi)地址輸出,當(dāng)程序顯示函數(shù)信息時(shí),GDB會(huì)顯出函數(shù)的參數(shù)地址。系統(tǒng)默認(rèn)為打開(kāi)的,
show print address
查看當(dāng)前地址顯示選項(xiàng)是否打開(kāi)。
set print array
set print array on
打開(kāi)數(shù)組顯示,打開(kāi)后當(dāng)數(shù)組顯示時(shí),每個(gè)元素占一行,如果不打開(kāi)的話,每個(gè)元素則以逗號(hào)分隔。這個(gè)選項(xiàng)默認(rèn)是關(guān)閉的。與之相關(guān)的兩個(gè)命令如下,我就不再多說(shuō)了。
set print array off
show print array
set print elements
這個(gè)選項(xiàng)主要是設(shè)置數(shù)組的,如果你的數(shù)組太大了,那么就可以指定一個(gè)來(lái)指定數(shù)據(jù)顯示的最大長(zhǎng)度,當(dāng)?shù)竭_(dá)這個(gè)長(zhǎng)度時(shí),GDB就不再往下顯示了。如果設(shè)置為0,則表示不限制。
show print elements
查看print elements的選項(xiàng)信息。
set print null-stop
如果打開(kāi)了這個(gè)選項(xiàng),那么當(dāng)顯示字符串時(shí),遇到結(jié)束符則停止顯示。這個(gè)選項(xiàng)默認(rèn)為off。
set print pretty on
如果打開(kāi)printf pretty這個(gè)選項(xiàng),那么當(dāng)GDB顯示結(jié)構(gòu)體時(shí)會(huì)比較漂亮。
14.關(guān)于顯示源碼list
使用GDB
一般來(lái)說(shuō)GDB主要調(diào)試的是C/C++的程序。要調(diào)試C/C++的程序,首先在編譯時(shí),我們必須要把調(diào)試信息加到可執(zhí)行文件中。使用編譯器(cc/gcc/g++)的 -g 參數(shù)可以做到這一點(diǎn)。如:
$gcc -g -Wall hello.c -o hello
$g++ -g -Wall hello.cpp -o hello
如果沒(méi)有-g,你將看不見(jiàn)程序的函數(shù)名、變量名,所代替的全是運(yùn)行時(shí)的內(nèi)存地址。當(dāng)你用-g把調(diào)試信息加入之后,并成功編譯目標(biāo)代碼以后,讓我們來(lái)看看如何用gdb來(lái)調(diào)試他。
啟動(dòng)GDB的方法有以下幾種:
gdb program
program也就是你的執(zhí)行文件,一般在當(dāng)前目錄下。
gdb program core
用gdb同時(shí)調(diào)試一個(gè)運(yùn)行程序和core文件,core是程序非法執(zhí)行后core dump后產(chǎn)生的文件。
gdb program PID
如果你的程序是一個(gè)服務(wù)程序,那么你可以指定這個(gè)服務(wù)程序運(yùn)行時(shí)的進(jìn)程ID。gdb會(huì)自動(dòng)attach上去,并調(diào)試他。program應(yīng)該在PATH環(huán)境變量中搜索得到。
以上三種都是進(jìn)入gdb環(huán)境和加載被調(diào)試程序同時(shí)進(jìn)行的。也可以先進(jìn)入gdb環(huán)境,在加載被調(diào)試程序,方法如下:
*在終端輸入:gdb
*在gdb環(huán)境中:file program
這兩步等價(jià)于:gdb program
GDB啟動(dòng)時(shí),可以加上一些GDB的啟動(dòng)開(kāi)關(guān),詳細(xì)的開(kāi)關(guān)可以用gdb -help查看。我在下面只例舉一些比較常用的參數(shù):
-symbols file
-s file
從指定文件中讀取符號(hào)表。
-se file
從指定文件中讀取符號(hào)表信息,并把他用在可執(zhí)行文件中。
-core file
-c file
調(diào)試時(shí)core dump的core文件。
-directory directory
-d directory
加入一個(gè)源文件的搜索路徑。默認(rèn)搜索路徑是環(huán)境變量中PATH所定義的路徑。
LiteIDE調(diào)試Go語(yǔ)言需要安裝GDB
1.先解決brew不能使用的問(wèn)題
cd /usr/local/Library
git pull origin master
brew update
brew prune
brew doctor
參考:
2.用Homebrew 安裝 gdb
(1)
# brew tap homebrew/dupes
(2)
# brew install gdb
(3)有可能提示:
Warning: No developer tools installed.
You should install the Command Line Tools.
Run `xcode-select --install` to install them.
那就先安裝the Command Line Tools.
# xcode-select --install
3.給gdb制作證書(shū)并授權(quán):
如果沒(méi)有證書(shū),會(huì)出現(xiàn)如下提示:
(gdb) run
Starting program: /Users/wenke/go/src/gdb/main
Unable to find Mach task port for process-id 18420: (os/kern) failure (0x5).
(please check gdb is codesigned - see taskgated(8))