預處理:進行標頭檔案展開、巨集替換、去掉注釋和條件編譯等(生成 *.i 檔案)。
編譯:檢查**無語法錯誤後,生成組合語言**(生成 *.s 檔案)。
彙編:將組合語言**生成機器碼(生成目標檔案 *.o)。
引數作用
-epreprocess only; do not compile, assemble or link.
-scompile only; do not assemble or link.
-ccompile and assemble, but do not link.
-o < file >
place the output into < file >.
-g為除錯程式(如gdb)生成相關資訊.
即:-o:指定輸出檔案。
#include#define hello "hello world!"
int main()
執行g++ file.cpp -e -o file.i,得到結果:
# 1 "file.cpp"
# 1 ""
# 1 ""
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "" 2
# 1 "file.cpp"
# 1 "/usr/include/c++/8/iostream" 1 3
# 36 "/usr/include/c++/8/iostream" 3
# 37 "/usr/include/c++/8/iostream" 3
# 1 "/usr/include/c++/8/x86_64-redhat-linux/bits/c++config.h" 1 3
# 1 "/usr/include/bits/wordsize.h" 1 3 4
# 4 "/usr/include/c++/8/x86_64-redhat-linux/bits/c++config.h" 2 3
# 2180 "/usr/include/c++/8/x86_64-redhat-linux/bits/c++config.h" 3
# 2180 "/usr/include/c++/8/x86_64-redhat-linux/bits/c++config.h" 3
namespace std
......
# 2 "file.cpp" 2
# 3 "file.cpp"
int main()
可以看到巨集與注釋被替換和處理掉了。
執行g++ file.i -s -o file.s,得到結果:
file "file.cpp"
.text
.section .rodata
.type _zstl19piecewise_construct, @object
.size _zstl19piecewise_construct, 1
_zstl19piecewise_construct:
.zero 1
.local _zstl8__ioinit
.comm _zstl8__ioinit,1,1
.lc0:
.string "hello world!"
.text
.globl main
.type main, @function
main:
.lfb1518:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.lc0, %esi
movl $_zst4cout, %edi
call _zstlsist11char_traitsiceerst13basic_ostreamict_es5_pkc
movl $_zst4endlicst11char_traitsiceerst13basic_ostreamit_t0_es6_, %esi
movq %rax, %rdi
call _znsolsepfrsos_e
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret.cfi_endproc
......
可以看到處理後得到的彙編**。
繼續執行g++ file.s -c -o file.o,得到:
[pig@localhost learn]$ head file.o
elf>�@@uh������h����]�uh��h���}��u��}�u'�}���u���������uh�����������]�hello world!gcc: (gnu) 8.2.1 20180905 (red hat 8.2.1-3)zrx
�'abc
y<>a�c
p\a�c
��%4'>de
s'x���+cfile.cpp_zstl19piecewise_construct_zstl8__ioinit_z41__static_initialization_and_destruction_0ii_global__sub_i_main_zst4cout_zstlsist11char_traitsiceerst13basic_ostreamict_es5_pkc_zst4endlicst11char_traitsiceerst13basic_ostreamit_t0_es6__znsolsepfrsos_e_znst8ios_base4initc1ev__dso_handle_znst8ios_base4initd1ev__cxa_atexit
��������
��������e
j��������o
ty
繼續執行g++ file.o -o file.out,得到可執行檔案。執行./file.out,得到:
[pig@localhost learn]$ g++ file.o -o file.out
[pig@localhost learn]$ ./file.out
hello world!
[pig@localhost learn]$
在使用gdb除錯程式時,需要在g++的引數中加入 -g,然後執行gdb *.out。否則,除錯時看到的將是一堆彙編**。
命令縮寫
描述help
h獲取幫助資訊
list
l顯示源**
search
朝向檔案尾部搜尋源**
reverse-search
朝檔案頭部搜尋源**
break
b設定斷點
info break
檢視斷點資訊
clear
清楚當前行的斷點
runr
從頭執行程式到第乙個斷點
next
n單步執行(不進入函式體)
step
s單步執行(進入函式體)
continue
c從當前行繼續執行程式至下一斷點
p列印變數值
watch
設定觀察點
set var variable=value
設定變數variable的值為value
bt檢視執行時棧
quit
q退出gdb
命令作用
b num
根據行號設定斷點
b file.c:num
設定指定檔案中的行號斷點
b function
根據函式名設定斷點
b file.cpp:num if(express)
根據表達時條件在某行設定斷點
rbreak function*
對所有function呼叫設定斷點
rbreak .
對所有函式設定斷點
rbreak file.cpp:.
對檔案中的所有函式設定斷點
rbreak file.cpp:^express
對file.cpp中所有express開頭的函式設定斷點
tbreak
斷點僅生效一次
ignore num time
忽略斷點號為num的斷點time次
disable
禁用所有斷點
disbale num
禁用編號為num的斷點
enable
啟用所有斷點
enable num
啟用編號為num的斷點
enable delete num
啟用並在此之後刪除編號為num的斷點
clear
刪除當前行所有斷點
clear function
刪除函式名為function的斷點
delete
刪除所有斷點、觀察點和捕捉點
delete num
刪除編號為num的斷點
end…
gcc命令與gdb命令常用選項
用法 gcc 選項 檔名 選項 學用命令 1 編譯.c生成可執行檔案 gcc o hello world hello world.c2 編譯.c檔案生成目錄檔案 gcc 0 hello world.o c hello world.c gcc o hello world hello world.o4 ...
詳解GCC與GDB 常用的命令
linux下程式設計,少不了和gcc,gdb打交道,現在總結下常用命令,掌握這些足夠用了。gcc常用的選項 o 指定生成的輸出檔案,e 僅執行編譯預處理 gcc的 e選項,可以讓編譯器在預處理後停止,並輸出預處理結果。s 將c 轉換為彙編 gcc的 s選項,表示在程式編譯期間,在生成彙編 後停止 w...
GDB常用命令與Visual Studio對比
命令名稱 gdbvisual studio 執行程式 runs args f5 start debugging 開始除錯 啟動程式 start atgs f10 step over 逐過程 暫停ctrl c ctrl alt break break all 全部中斷 繼續執行 continue co...