跨平臺IDE編譯調試C++很方便,如QTCreate 、VSCode、Eclipse等,但是如果只能使用Shell控制臺呢,gdb調試的優勢就很明顯了,在沒有IDE的情況下,這個方式最有效。因為上手不是很難,特此整理
參考鏈接
目錄
- 1、GDB調試
- 1.1、gcc 編譯輸出可調試程序
- 1.2 cmake編譯輸出可調試程序
- 1.3gdb常用指令
- 1.4gdb操作步驟
- 2、core調試
- 3、調試正在運行的程序
1、GDB調試
1.1、gcc 編譯輸出可調試程序
命令樣例
gcc -g -o Run_exe test.c
1.2 cmake編譯輸出可調試程序
在CMakeList.txt中增加如下字段即可
# 設置為調試模式
set(CMAKE_BUILD_TYPE "Debug")
# 配置調試信息
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g")
1.3gdb常用指令
gdb調試主要記住這個表,再就是開始實戰操作
命令 | 命令縮寫 | 命令說明 |
---|---|---|
set args | 設置主程序的外部參數 例如:./Run_exe argc1 argc2 | |
break | b | 設置斷點,b 3 表示在第3行設置斷點,可以設置多個斷點;也可以b functionName ,對函數下斷點 info b 查看所有斷點信息 delete 1 標識取消第一個斷點,斷點號通過info b可以查詢得到 |
run | r | 開始運行程序,程序運行到斷點位置會停下來,如果沒有遇到斷點,程序一直運行下去 |
next | n | 執行當前行語句,如果該語句為函數調用,不會進入函數內部執行 |
step | s | 執行當前語句,如果該語句為函數調用,則進入函數執行其中的第一條語句。 注意了:如果函數是庫函數或者第三方提供的函數,用s也是進不去的,因為沒有源代碼,如果是你自定義的函數,只要有源碼就可以進去 |
p | 顯示變量值,例如:p name 表示顯示變量name的值。 | |
list | 輸入該命令,回車,可以查看10行源代碼,再不用輸入命令,直接回車,還可以繼續看十行源代碼 | |
continue | c | 繼續程序的運行,直到遇到下一個斷點 |
bt | 查看程序執行到當前位置的調用棧 | |
set var name=value | 設置變量的值,假設程序有兩個變量: int ii;調試的時候 set var ii=22 即,把ii的值設置為22 char name[50];調試的時候 set var name=“測試” 把name的值設置為“測試”,注意這里不是strcpy | |
quit | q | 退出gdb環境 |
1.4gdb操作步驟
這里假設已經編譯出可調式的程序
1、gdb 調試JoinTieGCP_EXE
2、在該程序511設置斷點(如上圖)
3、設置外部傳參命令
4、r運行程序,n下一步(不進入),s下一步(進入),list查看源代碼,info b 查看斷點等等
2、core調試
core調試主要查看程序異常在哪一行運行掛掉,中文輸出“段錯誤”,英文輸出“core dump”
表現如下(對于其他錯誤應該不支持該方法)
接下來操作步驟:
1、ulimit -a 查看系統參數;
2、ulimit -c unlimit 把core文件的大小設置為無限制;
3、運行程序,生成core文件;
4、gdb 程序名 core文件名
5、輸入命令“bt”,查看函數調用棧
3、調試正在運行的程序
1、程序執行中
測試程序中寫一個for循環100次,每次循環等待1秒的測試程序。
2、查找進程ID,進入進程調試
查找進程ID
ps -ef|grep book1
gdb調試
gdb book1 -p 21495
剩下的就跟gdb調試差不多了