1. 程式人生 > >gdb 除錯基礎操作和在qtcreator中使用gdb除錯

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
在下面輸入變數或者陣列的名稱
如圖
這裡寫圖片描述