欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux下gdb調(diào)試打印進(jìn)程內(nèi)存信息方式

 更新時(shí)間:2023年09月04日 09:27:27   作者:凌肖戰(zhàn)  
這篇文章主要介紹了Linux下gdb調(diào)試打印進(jìn)程內(nèi)存信息方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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)文章

  • 如何使用shell在多服務(wù)器上批量操作

    如何使用shell在多服務(wù)器上批量操作

    日常工作中,我們常需要同時(shí)在多臺(tái)服務(wù)器上執(zhí)行同樣的命令,如對(duì)比日志、檢查服務(wù)等。這就需要我們有服務(wù)器批量操作的能力,我們可以借用 ssh公鑰登陸的能力,方便地實(shí)現(xiàn)在多個(gè)服務(wù)器上批量執(zhí)行命令。
    2021-05-05
  • Linux中的curl命令詳解

    Linux中的curl命令詳解

    大家應(yīng)該都知道在Linux中curl是一個(gè)利用URL規(guī)則在命令行下工作的文件傳輸工具,可以說(shuō)是一款很強(qiáng)大的http命令行工具。它支持文件的上傳和下載,是綜合傳輸工具,但按傳統(tǒng),習(xí)慣稱url為下載工具。本文將詳細(xì)介紹Linux中的curl命令,下面來(lái)一起看看吧。
    2016-11-11
  • 關(guān)于linux下core dump【總結(jié)】

    關(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-01
  • Linux?CentOS7?vim重復(fù)行問(wèn)題

    Linux?CentOS7?vim重復(fù)行問(wèn)題

    這篇文章主要介紹了Linux?CentOS7?vim重復(fù)行問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Linux下安裝Python3和django并配置mysql作為django默認(rèn)服務(wù)器方法

    Linux下安裝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-10
  • Linux系統(tǒng)中配置靜態(tài)IP地址的詳細(xì)步驟

    Linux系統(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-03
  • CentOS7服務(wù)器中apache、php7以及mysql5.7的安裝配置代碼

    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的配置

    這篇文章主要介紹了詳解虛擬機(jī)中CentOS 7 網(wǎng)絡(luò)和ssh的配置,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • linux nc命令小結(jié)

    linux nc命令小結(jié)

    這篇文章主要介紹了linux nc命令小結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • Apache?Pulsar集群搭建部署詳細(xì)過(guò)程

    Apache?Pulsar集群搭建部署詳細(xì)過(guò)程

    這篇文章主要介紹了Apache?Pulsar集群搭建過(guò)程,搭建Pulsar集群至少需要3個(gè)組件:ZooKeeper集群、BookKeeper集群和Broker集群,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02

最新評(píng)論