Linux下gdb調(diào)試打印進(jìn)程內(nèi)存信息方式
Linux下gdb調(diào)試打印進(jìn)程內(nèi)存信息
以下面代碼為例,打印進(jìn)程的內(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 調(diào)試中,也可以打印進(jìn)程的內(nèi)存信息。
命令如下:i proc mappings
下面進(jìn)行 gdb 調(diào)試,打印進(jìn)程的內(nèi)存信息。
操作如下:
- 首先,在程序某一行打斷點(diǎn)。
- 其次,輸入 r 命令運(yùn)行程序。
- 最后,輸入 i proc mappings 命令打印進(jìn)程的內(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
可以看到,輸出了進(jìn)程的內(nèi)存映射信息。
也可顯示更詳細(xì)的進(jìn)程內(nèi)存信息。
命令為:i files 命令 或者 i target 命令
包括引用的動態(tài)鏈接庫等等。。。
如下所示:

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

