g 編譯 gdb除錯 coredump除錯

2021-09-25 18:45:07 字數 3816 閱讀 5961

**:

1.使用g++編譯cpp檔案如果用gcc編譯c++原始檔時,加以下選項:-lstdc++,否則使用了c++操作的檔案編譯會出錯。

2.gcc/g++ 在執行編譯時,需要4步

①   預處理,生成.i的檔案[使用-e引數]

②   將預處理後的檔案把轉換成組合語言,生成檔案.s[使用-s引數]

③   由彙編變為目標**(機器**)生成.o的檔案[使用-c引數]

④   連線目標**,生成可執行程式[使用-o引數]

1.gdb的除錯命令列表.

命令解釋

簡寫file

裝入想要除錯的可執行檔案

無list

列出產生執行檔案源**的一部分

lnext

執行一行源**但不進入函式內部

nstep

執行一行源**而且進入函式內部

srun

執行當前被除錯的程式

rcontinue

繼續執行程式

cquit

終止gdb

qprint

輸出當前制定變數的值

pbreak

在**裡設定斷點

binfo break

檢視設定斷點的資訊

ibdelete

刪除設定的斷點

dwatch

監視乙個變數的值,一旦值有變化,程式停住。

wahelp

gdb的幫助命令

h使用方法:

在編譯程式的時候新增 –g引數,比如:

g++ -g -o hello hello.cpp

在gdb進行除錯的使用再輸入命令gdb+可執行檔名,比如:

gdb  hello

檢視原始檔 list 1,回車重複上一次指令

之後就是根據引數列表,按照自己的需求輸入自己的命令。

參考**:

如果要產生core檔案,可以用gdb [程式名] [core檔名]進入後,輸入bt檢視堆疊資訊。可參考:

另外,如果用makefile進行編譯的話,要特別注意使用正規表示式,否則編譯出的檔案將不能用於除錯。

比如makefile1:(執行正常)

executemain : main.o commonfun.o mytool.o

g++ -o executemain main.o commonfun.o mytool.o

main.o : main.cpp commonfun.h mytool.h

g++ -g -c main.cpp

common.o : commonfun.h commonfun.cpp

g++ -g -c commonfun.cpp

mytool.o : mytool.h mytool.cpp

g++ -g -c mytool.cpp

clean :

rm -f executemain main.o commonfun.o mytool.o

而makefile2:

compiler=g++

executemain : main.o commonfun.o mytool.o

$(compiler) -o $@ $^

..c.o :

$(compiler) -g -c  $<

clean :

rm -f *.o executemain

會提示出如下的錯誤:

...

reading symbolsfrom/*****/howtousemakefile/executemain...(no debugging symbols found)...done.

編譯優化(-o -o2): 指標優化

**覆蓋(-fprofile-arcs -ftest-coverage): 統計**資訊

-lpthread: 執行緒相關

-lrt: 混合鏈結

-ldl:  靜態鏈結和動態鏈結

-luuid:  唯一識別碼

-lm:  math.h函式庫libm.so

-lcrypt: 與ssl加密有關

-wl:告訴編譯器將後面的引數傳遞給鏈結器。

編譯靜態庫或動態庫:

詳情見附件:g++編譯選項對應表。

附件1:g++編譯選項對應表:

gcc/g++

命令的常用選項格式(選項  解釋)

-o file

指定輸出檔名,在編譯為目標**時,這一選項不是必須的。如果file沒有指定,預設檔名是a.out.

-c只編譯生成目標檔案,不鏈結

-m486

針對 486 進行**優化。

-o0不進行優化處理。

-o 或 -o1

優化生成**。

-o2進一步優化。

-o3比 -o2 更進一步優化,包括 inline 函式。

-w關閉所有警告,建議不要使用此項

-wall

允許發出gcc能提供的所有有用的警告,也可以用-w(warning)來標記指定的警告

-werror

把所有警告轉換為錯誤,以在警告發生時中止編譯過程

-mm輸出乙個make相容的相關列表

-v顯示在編譯過程的每一步中用到的命令

-e只執行 c 預編譯器。

-shared

生成共享目標檔案。通常用在建立共享庫時。

-static

鏈結靜態庫,即執行靜態鏈結

-lfoo

鏈結名為libfoo的函式庫

-g在可執行程式中包含標準除錯資訊

-ggdb

在可執行程式中包含只有gnu debugger才能使別的達兩條是資訊

-o優化編譯過的**

-on指定**優化的級別為n,o<=n<=3

-ansi

-pedantic

允許發出ansi/iso c標準所列出的所有警告

-errors

允許發出ansi/iso c標準所列出的所有錯誤

-traditional

支援kernighan & ritchie c語法(如用舊式語法定義函式);如果不知道這個選項的含義,也沒有關係

-idirectory

指定額外的標頭檔案搜尋路徑directory。

-ldirectory

指定額外的函式庫搜尋路徑directory。

-dfoo=bar

在命令列定義預處理巨集foo,其值為bar

-idirname

將dirname加入到頭檔案的搜尋目錄列表中

-ldirname

將dirname加入到庫檔案的搜尋目錄列表中,預設情況下gcc 只鏈結共享庫

-dmacro

以字串「1」定義 macro 巨集。

-dmacro=defn

以字串「defn」定義 macro 巨集。

-umacro

取消對 macro 巨集的定義。

分類: 開發

3 GDB程式除錯及Coredum

gdb是gnu發布的一款功能強大的程式除錯工具。gdb主要完成下面三個方面的功能 1 啟動被除錯程式。2 讓被除錯的程式在指定的位置停住。3 當程式被停住時,可以檢查程式狀態 如變數值 1.編譯生成可執行檔案 gcc g tst.c o tst 2.啟動gdb gdb tst 3.在 main函式處...

gdb除錯,交叉編譯除錯

root localhost pwd root root localhost cat gdbinit.bak set solib absolute prefix opt embedsky 4.3.3 arm none linux gnueabi set solib search path opt e...

交叉編譯gdb除錯

編譯環境 ubuntu16.04 64位 交叉編譯工具 arm hisiv500 linux gcc 在開發過程中總會遇到段錯誤之類的問題,交叉編譯gdb方便在開發板上除錯,這裡記錄一下編譯流程。2.開發板上gdb除錯流程 cd work mkdir gdb.install tar zxf term...