感謝北大王修遠(yuǎn)同學(xué)分享gcc和gdb的使用技巧: 通俗易懂, 包教包會

# GCC & GDB
作者: 北大王修遠(yuǎn)
---
- 安裝
?- ubuntu:sudo apt install gcc
?- windows:mingw[Welcome to MinGW.OSDN](http://mingw.osdn.io/index.html)
- 官方文檔:[Top (Using the GNU Compiler Collection (GCC))](https://gcc.gnu.org/onlinedocs/gcc/)
- 編譯流程
???
?1. 預(yù)處理(preprocessing):去注釋、頭文件包含、宏替換、條件編譯
????-E 選項(xiàng)指示編譯器僅對輸入文件進(jìn)行預(yù)處理(.i文件)
?2. 編譯(compilation)
????-S 選項(xiàng)產(chǎn)生匯編語言文件(.s文件)
?3. 匯編(assembly)
????-c 選項(xiàng)編譯為機(jī)器語言的目標(biāo)代碼(.o文件)
?4. 鏈接(link)(可執(zhí)行文件)
????-l 指定單個庫文件, -L指定庫文件目錄
- 幫助:gcc --help, man gcc
- 常用編譯選項(xiàng)
?- -o \<filename>
?- -D\<macro>
?- 編譯標(biāo)準(zhǔn):[C Dialect Options (Using the GNU Compiler Collection (GCC))](https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html)
???- -ansi(對于C等價于 -std=c90;對于C++等價于-std=c++98)
???- -std=???//c99_c11.c
?- 警告:[Warning Options (Using the GNU Compiler Collection (GCC))](https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html)
???- -Wall:全部警告 //wall.c
???- -Wextra, -Werror
?- 優(yōu)化:[Optimize Options (Using the GNU Compiler Collection (GCC))](https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)
???- -O0, -O1, -O2, -O3 //fibonacci.c
???- -Ofast:在-O3的基礎(chǔ)上進(jìn)一步優(yōu)化,不嚴(yán)格按照標(biāo)準(zhǔn)
???- -Os: 最優(yōu)化文件大小,開啟所有一般不增加文件大小的-O2選項(xiàng),并額外執(zhí)行一些優(yōu)化代碼大小的選項(xiàng)。
?????- -Oz:優(yōu)化文件大小,相對于-Os更加激進(jìn),可能降低速度
?- -g:生成gdb符號表[Debugging Options (Using the GNU Compiler Collection (GCC))](https://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html)
???- Og:debug優(yōu)化
- 完整編譯選項(xiàng)列表參見[Top (Using the GNU Compiler Collection (GCC))](https://gcc.gnu.org/onlinedocs/gcc/)
---
GDB
- 幫助:help,man gdb, [Top (Debugging with GDB) (sourceware.org)](https://sourceware.org/gdb/current/onlinedocs/gdb.html/)
- 使用:gdb <filename>
- 命令:
?- 顯示:
???- l(list): 顯示指定行號或者指定函數(shù)附近的代碼??
?????- set listsize
?????- show listsize
???- p(print): 顯示變量或表達(dá)式的值
???- disp(display): 把一個表達(dá)式設(shè)置為display,當(dāng)程序每次停下來時都會顯示其值
???- i(info): 顯示各種信息,如i b顯示所有斷點(diǎn), i disp 顯示display,i lo顯示所有局部變量
?- 斷點(diǎn):
???- b(break): 在指定行號或者指定函數(shù)開頭處設(shè)置斷點(diǎn)
?????- cond 條件斷點(diǎn) e.g. cond 2 i==5
?????- watch \<var>,awatch(讀寫), rwatch(讀)
?????- 編譯器可能會優(yōu)化掉某些行,此時使用-O0 //code.cpp -Og; b 77
???- cl(clear): 取消斷點(diǎn),和b的格式相同,如果該位置有多個斷點(diǎn)將同時取消
???- d(delete): 取消指定編號的斷點(diǎn),若不指定編號則刪除所有斷點(diǎn)
?- 運(yùn)行:
???- r(run): 運(yùn)行程序,直到程序結(jié)束或者遇到斷點(diǎn)而停下
???- c(continue): 在程序中斷后繼續(xù)執(zhí)行程序,直到程序結(jié)束或者遇到斷點(diǎn)而停下。在程序開始執(zhí)行前只能用r,不能用c
???- n(next): 執(zhí)行一條語句,如果有函數(shù)調(diào)用,則把它作為一個整體
???- s(step): 執(zhí)行一條語句,如果有函數(shù)調(diào)用,則進(jìn)入函數(shù)內(nèi)部
???- u(until): 執(zhí)行到指定行號或者指定函數(shù)的開頭
?- q(quit)
?作者:盧朓 https://www.bilibili.com/read/cv23897007?spm_id_from=333.999.0.0 出處:bilibili