Linux下gdb調試打印進程內(nèi)存信息方式
Linux下gdb調試打印進程內(nèi)存信息
以下面代碼為例,打印進程的內(nèi)存信息。
代碼如下:
#include <stdio.h> int main(void) { int i = 0; char data[100] = {0}; for(i = 0; i < (sizeof(data)/sizeof(char)); i++) { data[i] = i; } return 0; }
在 gdb 調試中,也可以打印進程的內(nèi)存信息。
命令如下:i proc mappings
下面進行 gdb 調試,打印進程的內(nèi)存信息。
操作如下:
- 首先,在程序某一行打斷點。
- 其次,輸入 r 命令運行程序。
- 最后,輸入 i proc mappings 命令打印進程的內(nèi)存信息。
如下所示:
(gdb) i proc mappings
process 4261
Mapped address spaces:Start Addr End Addr Size Offset objfile
0x555555554000 0x555555555000 0x1000 0x0 /home/wangtian/Code_Learns/C_Learns/debug/debug2/main.out
0x555555555000 0x555555556000 0x1000 0x1000 /home/wangtian/Code_Learns/C_Learns/debug/debug2/main.out
0x555555556000 0x555555557000 0x1000 0x2000 /home/wangtian/Code_Learns/C_Learns/debug/debug2/main.out
0x555555557000 0x555555558000 0x1000 0x2000 /home/wangtian/Code_Learns/C_Learns/debug/debug2/main.out
0x555555558000 0x555555559000 0x1000 0x3000 /home/wangtian/Code_Learns/C_Learns/debug/debug2/main.out
0x7ffff7dc3000 0x7ffff7de5000 0x22000 0x0 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0x7ffff7de5000 0x7ffff7f5d000 0x178000 0x22000 /usr/lib/x86_64-linux-gnu/libc-2.31.so
0x7ffff7f5d000 0x7ffff7fab000 0x4e000 0x19a000 /usr/lib/x86_64-linux-gnu/libc-2.31.so
可以看到,輸出了進程的內(nèi)存映射信息。
也可顯示更詳細的進程內(nèi)存信息。
命令為:i files 命令 或者 i target 命令
包括引用的動態(tài)鏈接庫等等。。。
如下所示:
Linux之gdb基本調試命令與總結
一、常見gdb調試命令
表1 gdb基本調試指令
命令 | 描述 |
backtrace(或bt) | 查看各級函數(shù)調用及參數(shù) |
finish | 連續(xù)運行到當前函數(shù)返回為止,然后停下來等待命令 |
frame(或f) 幀編號 | 選擇棧幀 |
info(或i) locals | 查看當前棧幀局部變量的值 |
list(或l) | 列出源代碼,接著上次的位置往下列,每次列10行 |
continue(c) | 列出從第幾行開始的源代碼 |
list 函數(shù)名 | 繼續(xù)執(zhí)行 |
next(或n) | 執(zhí)行下一行語句 |
print(或p) | 打印表達式的值,通過表達式可以修改變量的值或者調用函數(shù) |
quit(或q) | 退出 gdb 調試環(huán)境 |
set var | 修改變量的值 |
start | 開始執(zhí)行程序,停在 main 函數(shù)第一行語句前面等待命令 |
step(或s) | 執(zhí)行下一行語句,如果有函數(shù)調用則進入到函數(shù)中 |
break(b) | 設置斷點 |
delete(d) | 刪除斷點 |
attach <pid> | attach到進程 ID 為 pid 的進程 |
二、info調試指令
表2 info調試命令
命令 | 描述 |
info registers | 查看除了浮點寄存器以外的寄存器 |
info all-registers | 查看所有寄存器,包括浮點寄存器 |
info registers <regname …> | 查看所指定的寄存器 |
info break | 查看斷點信息 |
info watchpoints | 列出當前所設置的所有觀察點 |
info signals info handle | 查看有哪些信號正在被GDB檢測 |
info frame | 查看當前程序棧的信息 |
info threads | 可以看多線程 |
info args | 查看當前函數(shù)參數(shù)信息 |
info locals | 查看當前程序棧的局部變量 |
三、內(nèi)存查看
3.1 打印內(nèi)存數(shù)據(jù)
gdb查看指定地址的內(nèi)存地址的值:examine 簡寫 x-----使用gdb> help x 來查看使用方式
x/ (n,f,u為可選參數(shù))
n
: 需要顯示的內(nèi)存單元個數(shù),也就是從當前地址向后顯示幾個內(nèi)存單元的內(nèi)容,一個內(nèi)存單元的大小由后面的u定義f
:顯示格式
x(hex) 按十六進制格式顯示變量。
d(decimal) 按十進制格式顯示變量。
u(unsigned decimal) 按十進制格式顯示無符號整型。
o(octal) 按八進制格式顯示變量。
t(binary) 按二進制格式顯示變量。
a(address) 按十六進制格式顯示變量。
c(char) 按字符格式顯示變量。
f(float) 按浮點數(shù)格式顯示變量
u
:每個單元的大小,按字節(jié)數(shù)來計算。默認是4 bytes。GDB會從指定內(nèi)存地址開始讀取指定字節(jié),并把其當作一個值取出來,并使用格式f來顯示
b:1 byte h:2 bytes w:4 bytes g:8 bytes
比如x/3uh 0x54320表示從內(nèi)存地址0x54320讀取內(nèi)容,h表示以雙字節(jié)為單位,3表示輸出3個單位,u表示按照十六進制顯示。
3.2 打印數(shù)組
比如我有一個數(shù)組的定義 :int a[] = {1, 2, 3, 4, 5};
那么想要顯示的時候就可以寫:
p *a@5
這樣就會顯示數(shù)組a中的所有元素。
也可以使用display在一部調試的時候都顯示:
display *a@5
四、多線程調試命令
表4 多線程調試命令
命令 | 描述 |
info threads | 顯示當前可調試的所有線程,每個線程會有一個GDB為其分配的ID,后面操作線程的時候會用到這個ID。 前面有*的是當前調試的線程 |
thread ID(1,2,3…) | 切換當前調試的線程為指定ID的線程 |
break thread_test.c:123 thread all(例:在相應函數(shù)的位置設置斷點break pthread_run1) | 在所有線程中相應的行上設置斷點 |
thread apply ID1 ID2 command | 讓一個或者多個線程執(zhí)行GDB命令command |
thread apply all command | 讓所有被調試線程執(zhí)行GDB命令command |
set scheduler-locking 選項 command | 設置線程是以什么方式來執(zhí)行命令 |
set scheduler-locking off | 不鎖定任何線程,也就是所有線程都執(zhí)行,這是默認值 |
set scheduler-locking on | 只有當前被調試程序會執(zhí)行 |
set scheduler-locking on step | 在單步的時候,除了next過一個函數(shù)的情況(熟悉情況的人可能知道,這其實是一個設置斷點然后continue的行為)以外,只有當前線程會執(zhí)行 |
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Linux下安裝Python3和django并配置mysql作為django默認服務器方法
下面小編就為大家?guī)硪黄狶inux下安裝Python3和django并配置mysql作為django默認服務器方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10Linux系統(tǒng)中配置靜態(tài)IP地址的詳細步驟
本文詳細介紹了在Linux系統(tǒng)中配置靜態(tài)IP地址的五個步驟,包括打開終端、編輯網(wǎng)絡配置文件、配置IP地址、保存并重啟網(wǎng)絡服務,這對于系統(tǒng)管理員和新手都極具參考價值,需要的朋友可以參考下2025-03-03CentOS7服務器中apache、php7以及mysql5.7的安裝配置代碼
這篇文章主要介紹了CentOS7服務器中apache、php7以及mysql5.7的安裝配置代碼,需要的朋友可以參考下2017-10-10詳解虛擬機中CentOS 7 網(wǎng)絡和ssh的配置
這篇文章主要介紹了詳解虛擬機中CentOS 7 網(wǎng)絡和ssh的配置,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-03-03