g 與gdb常用引數與命令

2021-10-01 15:23:11 字數 4591 閱讀 1249

預處理:進行標頭檔案展開、巨集替換、去掉注釋和條件編譯等(生成 *.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從當前行繼續執行程式至下一斷點

print

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...