gdb 除錯基礎操作和在qtcreator中使用gdb除錯
最近使用多執行緒,老是出現未知錯誤,比如程式死鎖,或者執行緒突然掛掉,由於是多執行緒程式設計,單純使用cout找不到出錯點,只有學好gdb除錯才能解決問題.
1.gdb除錯基礎操作
學習的知識點為新建Debug工程,進入gdb除錯,載入除錯程式,設定斷點,檢視變數名,單步除錯,繼續,結束
(1)新建Debug工程
新建工程gdbtest,在CmakeLists中設定編譯選項為debug,使用命令
add_compile_options(-std=c++11 -g)
main.cpp如下
#include <stdio.h>
int nGlobalVar =0 ;
int tempFunction(int a,int b)
{
printf("tempFunction is called, a = %d, b = %d /n",a,b);
return (a +b);
}
int main()
{
int n;
n = 1;
n++;
n--;
nGlobalVar += 100;
nGlobalVar -= 12;
printf("n = %d, nGlobalVar = %d /n",n,nGlobalVar);
n = tempFunction(1,2);
printf ("n = %d",n);
return 0;
}
CmakeLists.txt
project(gdbtest)
cmake_minimum_required(VERSION 2.8)
add_compile_options(-std=c++11 -g)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
(2)進入gdb除錯
編譯後,在生成的可執行資料夾下輸入gdb,進入除錯模式
(3)載入被除錯程式
使用“file”命令載入被除錯程式
file gdbtest
輸出為Reading symbols from gdbtest…done.
表示在 main 函式開頭設定一個斷點(Breakpoint)
(4)b+行設定一個斷點
b+行在某行設定一個斷點
如b 17
在17行設定斷點
(5)執行除錯檔案
使用“r”命令執行(Run)被除錯檔案
程式停在17行
(6)輸出變數名
輸出變數名的值p+變數名
p nGlobalVar
輸出為
$1 = 88
(7)使用 b+函式名在 函式開頭設定一個斷點
如使用b tempFunction
在tempFunction函式開頭設定一個斷點
(8)使用s執行下一行程式碼
(9)繼續
使用“c”命令繼續(Continue)執行被除錯程式,程式將停在第二個斷點tempFunction的開頭,再次輸入c,函式結束輸出
Inferior 1 (process 14695) exited normally
(10)q退出gdb
整個實驗輸出如圖
2.qtcreator中使用gdb除錯
2.1首先解決錯誤 qt除錯 ptrace:不允許的操作
參考https://blog.csdn.net/makenothing/article/details/9531247
就是修改下面配置
sudo gedit /etc/sysctl.d/10-ptrace.conf
中的 kernel.yama.ptrace_scope = 1
為 kernel.yama.ptrace_scope = 0
2.qtcreator debug基本操作
(1)設定斷點
就在行旁邊單擊就行
(2)檢視變數的值
F5進入debug後滑鼠放在值上面就會顯示
(3)執行下一行
按F10
(4)繼續,會跳到下一個斷點
也是F5
(5)使用視窗檢視變數或者陣列的值
點Window->Views->Locals and Expressions
或者直接點下面的Views,選擇Locals and Expressions
在下面輸入變數或者陣列的名稱
如圖