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