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