gdb調試器—常用知識(一)


gdb內存監控

gdb watch 內存監控

gdb的watch的內存功能,使用場景一般是發現的情況,要查清楚一塊內存被誰給踩了,我們直接使用watch 監控它就可以了。

  • watch *(int*)內存地址: 當監控的內存的內容發生變化(即寫操作)時,程序停止運行。
  • rwatch *(int*)內存地址: 當監控的內存的內容發生讀操作時, 程序停止運行。
  • awatch *(int*)內存地址: 當監控的內存被讀或被寫時,程序停止運行。

當你們監控全局變量時,可以直接使用watch 全局變量名的方法。

使用系統庫mprotect API 進行內存保護

函數說明: int mprotect(void* addr, size_t len, int prot);
- 參數1, addr需要頁對齊
- 參數2, len需要頁大小的倍數
- 參數3,prot表示模式,取值為幾種枚舉值的或操作:PROT_NONE(0, 不能請問)/PROT_READ(1, 可讀)/PROT_WRITE(2, 可寫)/PROT_EXEC(4, 可執行)

該函數的使用場景是:有代碼中申請了一個大內存(大於4K),這塊內存很少修改或者不修改,例如一些配置數據等。 如果代碼執行過程中發現該塊內存被踩,但是具體的地址不能確定,這時就可以使用該函數這塊內存保護起來。

使用系統庫 perf_event 數據斷點 API 進行內存保護

暫時沒有使用過。

perf_evnt是內核對用戶態提供軟硬件性能數據的一個統一接口,用戶通過perf_event可以獲取到各種性能數據。用戶態的函數接口為:

int perf_vent_open(struct perf_event_attr* attr, pid_t pid, int cpu, int group_fd, unsigned_long

gdb中使用x命令查看內存的內容

x 命令說明

Examine memory, 使用格式為:x/FMT ADDRESS, 其中FMT中三部分組成:[count][format][size].(format與size的參數位置可以互換)

例如: x/10xw &a, 查看從&a開始的連續10 * 4 個字節的內存,以十六進制顯示出來。

  • count: 表示重復查看的數目,也就是一次性要看多少單位的內存。

  • format 表示要顯示的格式, 如以下幾種:

    format 含義
    o octal, 即八進制
    x hex, 十六進制
    d decimal, 十進制
    u unsigned decimal
    t binary, 二進制
    f float, 符號數
    a address, 地址的形式
    c char類型
    s string
    z hes, zero padded on the left
  • Size: 表示每一次顯示的單位大小。有以下幾種:

    Size 含義
    b byte, 一個字節大小
    h half word, 半個字大小,2個字節
    w word, 一個字大小,4個字節
    g giant, 8個字節

舉例

例如變量a的地址開始的4*4個字節長度的內容:

(gdb) p &a
$2 = (int *) 0x7fffffffe17c
(gdb) x/4xw 0x7fffffffe17c
0x7fffffffe17c:	0x00000001	0x55555310	0x00005555	0xf7af809b
(gdb) x/4i 0x7fffffffe17c
   0x7fffffffe17c:	add    %eax,(%rax)
   0x7fffffffe17e:	add    %al,(%rax)
   0x7fffffffe180:	adc    %dl,0x55(%rbx)
   0x7fffffffe183:	push   %rbp


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM