演算法筆記0 附錄(編譯器和偵錯程式)

2021-09-11 06:51:42 字數 3661 閱讀 1566

推薦

mingw

環境下的

gcc,和

linux

下的gcc

一致性較好。在

www.mingw.

org(或

g++編譯器

安裝後再命令列執行

gcc命令,如果顯示

gcc:no input files

則按照成功,如果沒有,則設定環境變數加入

bin目錄

若已經安裝了

devcpp

,可能已經含有

mingw

d:\program files (x86)\dev-cpp\mingw64

測試test.cpp

#include

main()//

沒有int

//沒有返回值

在命令列

gcc test.cpp

,程式沒有輸出,目錄下多出可執行檔案

a.exe

gcc test.cpp -o test

(可執行檔名為

test

)編譯後可以用

test

(linux

為./test

)執行程式

讓編譯顯示警告:

gcc test.cpp -o test -wall

編譯器警告了這三個問題

test.cpp: in function 'int main()':

test.cpp:7:19: warning: format '%d' expects a matching 'int' argument [-wformat=]

printf("%d%d\n",c);

進一步用

-ansi-pedantic

檢擦**是否符合

ansi c標準(

只能檢查

.c檔案,無法檢查

.cpp檔案)

gcc test.c -o test -wall -ansi -pedantic

test.c: in function 'main':

test.c:6:2: warning: iso c90 forbids mixed declarations and code [-wpedantic]

int c=a+b;//c

沒有在開頭定義

^ test.c:6:6: warning: unused variable 'c' [-wunused-variable]

int c=a+b; ^

-lm能讓編譯器連線數學庫允許使用

math.h

中函式,

c++會自動連線(副檔名

.cpp)

-ddebug

在編譯時定義符號

debug

,也可以換成其他的(如

local

)這樣#ifdef debug

到#endif

中間的語句會被編譯,否則其中不會被編譯

-o1 -o2

和-o3

可對**進行速度優化

gdb要和

gcc配合使用

編譯時加

-g生成除錯用的符號表(

gcc test.cpp -o test -wall -g)

編譯成exe

後,執行

gdb test.exe

顯示:reading symbols from test.exe...done.

從test. exe

中讀取符號 使用

l命令能看到源程式(l不是

1)l 15

,會顯示第

15行以及前後若干行。

l main

顯示main

函式開頭的附近15行

l顯示下10

行,list -

顯示上10行。

所有命令可以用

help list

檢視(gdb

中的命令可以用前幾個字母簡寫,

list寫成l

) 執行程式的命令是r(

run),設定斷點b(

break),c

(continue

)繼續執行,n(

next)和s

(step

)逐條執行(

next

把函式當作一行

,step

進入函式內部),

enter

b main

在main

的開頭設定斷點,也用行號設定斷點。

可以用b main和r

開頭除錯程式 u

(until

)執行到指定位置,p(

print

)列印變數值,

i lo

(info locals

)顯示所有區域性變數:

u doit

執行到doit

函式的開頭,此時可列印函式值

disp(display)

和n/s/u

等單步執行指令配合使用:

i disp

(info display

)列出所有

display,

刪除/禁止/

恢復display

:d(delete)/ dis(disable)/en(enable) disp (dislay)

類似根據斷點編號刪除/禁止

/恢復斷點,或cl(

clear

)根據行號或函式名刪除

gdb的高階功能:

棧幀相關命令(通過

help stack

檢視): bt

comm

(commands

)指定在某個斷點處停下來後執行

gdb命令, ig

(ignore

)讓斷點在前

count

次不停,

cond(condition)

給斷點加條件

:cond 2(

斷點編號

) i==5(

斷點條件)

watch

特殊斷點:

watch a

(wa a)在a

被修改時停下,並顯示修改前後的變數值,

awatch(aw

)每次被修改都停下

rwatch(rw

)在變數被讀時停下

call

可以像在**中一樣自由排程源程式函式:

call mysort(a,a+10)

如果是stl中函式

(sort)

可能需要在源程式中打包:

void mysort(int*p,int*q)

print,condition,display

也可以這樣使用函式: 如

p rand()

輸出隨機數,

condition

編寫乙個返回

bool

的函式專門作為斷點條件

盡量使用輸出中間變數,直覺,經驗除錯,不用

gdb

編譯器 偵錯程式

linux mac下使用的編譯器是不同的。linux下使用的是gcc編譯器。mac下使用的是clang編譯器。命令格式都是相通的。編譯命令的基本格式 g會在輸出檔案裡可以增加除錯資訊,編譯出的程式在執行過程 現的問題就可以用偵錯程式進行單步除錯。o實際是指令優化的級別。預設 o1是不對指令優化,所以...

GCC編譯器和GDB偵錯程式

gcc gnu compiler collection 是目前linux下最常用的c語言編譯器,它是gnu專案中符合ansi c標準的編譯系統,可以在多種硬體平台上編譯出可執行程式的超級編譯器,執行效率與一般的編譯器相比平均效率要高20 30 在終端中輸入下列命令 gcc options filen...

gcc編譯器和gdb偵錯程式

將高階語言 c語言 程式編譯成為機器可識別的指令 編譯過程 預處理 去掉注釋,展開所有 編譯 語義 語法糾錯,將 解釋成為彙編 彙編 將彙編 解釋成為機器指令 連線 鏈結 庫以及所有的目標檔案,生成可執行程式 庫檔案 大佬實現一些常用的功能介面,為了防止每次編譯耗費大量時間,因此將這些介面 進行編譯...