gdb除錯時呼叫函式 設定觀察點以及GDB的巨集

2021-10-09 23:59:37 字數 3342 閱讀 3739

table of contents

除錯時呼叫函式

觀察點gdb巨集

除錯是一項複雜的任務。開發人員大部分時間都花在除錯上,因此熟悉許多除錯工具很重要

在linux中,本機偵錯程式是gdb,它是基於命令列的,看起來醜陋而原始。許多開發人員,尤其是那些從windows移走並使用visual studio等工具的開發人員,都沒有給gdb乙個機會。

gdb是基於命令列的,您需要學習命令,並且看起來像在80年代進行除錯,但是有些任務只能用gdb來完成

我們將使用以下**:

#include#define addnum(a,b) ((a)+(b))

#define max(a,b) (a)>(b)?(addnum(a,100)):(addnum(b,50))

int a1=10,a2=20;

void f2()

void print_dbg()

int add(int a, int b)

void f1()

*p=100;

}int arr[1000];

void main()

當gdb在斷點處停止或執行**時,您可以呼叫帶有或不帶有引數的函式。

(gdb) b add

breakpoint 1 at 0x400654: file ./a.c, line 21.

(gdb) r

a1=10 a2=20

breakpoint 1, add (a=80, b=90) at ./a.c:21

21 int c= a+90;

(gdb) call print_dbg()

a1=10 a2=20

(gdb) delete breakpoints

delete all breakpoints? (y or n) y

(gdb) b a.c:34

breakpoint 2 at 0x4006bd: file ./a.c, line 34.

(gdb) c

continuing.

breakpoint 2, f1 () at ./a.c:34

34 a1++;

(gdb) call add(2,3)

$1 = 95

gdb的主要功能之一是能夠在更改某些內容時中斷。它可以是變數,位址或暫存器:

(gdb) watch a1

hardware watchpoint 1: a1

(gdb) r

a1=10 a2=20

hardware watchpoint 1: a1

old value = 10

new value = 11

f1 () at ./a.c:35

35 f2();

**位址變更

(gdb) p &arr

$1 = (int (*)[1000]) 0x601080

然後要求gdb在該位址的內容更改時停止

(gdb) watch *0x601080

hardware watchpoint 1: *0x601080

(gdb) r

hardware watchpoint 1: *0x601080

old value = 0

new value = 1

main () at ./a.c:43

43 f1();

觀察點註冊變更

使用暫存器也可以這樣做。

(gdb) watch $rax

watchpoint 1: $rax

(gdb) c

continuing.

watchpoint 1: $rax

old value = 4196067

new value = 0

0x00000000004006f6 in main () at ./a.c:43

43 f1();

使用.gdbinit檔案,您還可以為除錯會話定義新命令(巨集)。例如,如果您將以下內容寫入.gdbinit:

define irg

info registers

info threads

end

define pdb

print a1

print a2

call print_dbg()

end

它定義了兩個可以使用的新巨集– pdb,irg

(gdb) pdb

$2 = 10

$3 = 20

a1=10 a2=20

(gdb) irg

rax 0x0 0

rbx 0x0 0

rcx 0x6f77206f6c6c6568 8031924123371070824

rdx 0x7ffff7dd3780 140737351858048

rsi 0x5a 90

rdi 0x50 80

rbp 0x7fffffffdb50 0x7fffffffdb50

rsp 0x7fffffffdb50 0x7fffffffdb50

r8 0x0 0

r9 0xd 13

r10 0x0 0

r11 0x246 582

r12 0x4004e0 4195552

r13 0x7fffffffdc60 140737488346208

r14 0x0 0

r15 0x0 0

rip 0x400654 0x400654 eflags 0x246 [ pf zf if ]

cs 0x33 51

ss 0x2b 43

ds 0x0 0

es 0x0 0

fs 0x0 0

gs 0x0 0

id target id frame

gdb除錯(四)函式呼叫棧之 frame

函式呼叫棧由連續的棧幀組成。每個棧幀記錄乙個函式呼叫的資訊,這些資訊包括函式引數,函式變數,函式執行位址。當程式啟動後,棧中只有乙個幀,這個幀就是main函式的幀。我們把這個幀叫做初始化幀或者叫做最外層幀。每當一 個函式被呼叫,乙個新幀將被建立,每當乙個函式返回時,函式幀將被剔除。如果函式是個遞迴函...

通過gdb來除錯和觀察redis原始碼的執行

本文介紹如何通過gdb來除錯redis的源 相對於只是檢視原始碼,通過gdb還能夠在實際場景中觀察 如何執行,記憶體如何變化,這對於理解redis server的執行機制非常有必要。在進行redis server一般命令的執行機制除錯時,不需要你精通c c 程式設計,只需要知道gdb的一些基本命令就...

執行緒的檢視以及利用gdb除錯多執行緒

gdb除錯常用命令,attach,br,n,bt 在oceanbase除錯中,必須用到gdb,將常用命令蒐集記錄如下 1.attach 用gdb除錯乙個正在執行中的程序 gdb pid 2.br 設定斷點 br filename line num br namespace classname fun...