首页 > 系统相关 >实例:使用 gdb 查看进程内存中的数据结构

实例:使用 gdb 查看进程内存中的数据结构

时间:2024-09-09 11:36:54浏览次数:10  
标签:Node head next 链表 gdb 内存 数据结构 节点

代码示例

首先,创建一个简单的链表程序 linked_list.c,以演示如何使用 gdb 查看内存中的数据结构。

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 添加新节点到链表的尾部
void append(Node** head_ref, int new_data) {
    Node* new_node = (Node*)malloc(sizeof(Node));
    Node* last = *head_ref;

    new_node->data = new_data;
    new_node->next = NULL;

    // 如果链表为空,新节点成为头节点
    if (*head_ref == NULL) {
        *head_ref = new_node;
        return;
    }

    // 否则,遍历到链表的末尾,并添加新节点
    while (last->next != NULL) {
        last = last->next;
    }

    last->next = new_node;
}

// 打印链表的所有节点
void print_list(Node* node) {
    while (node != NULL) {
        printf("%d -> ", node->data);
        node = node->next;
    }
    printf("NULL\n");
}

int main() {
    Node* head = NULL;
    append(&head, 1);
    append(&head, 2);
    append(&head, 3);
    print_list(head);

    // 等待用户输入,以便在 gdb 中调试
    getchar();
    return 0;
}

编译程序

使用 -g 标志编译程序,以便生成调试信息:

bash gcc -g -o linked_list linked_list.c

使用 gdb 进行调试

  1. 启动 gdb

    bash gdb ./linked_list
  2. 设置断点:在 main 函数的入口处设置断点:

    gdb (gdb) break main
  3. 运行程序:开始运行程序,直到程序暂停在 main 函数的入口处:

    gdb (gdb) run
  4. 逐行执行:当断点命中时,逐行执行程序代码,直到到达定义 head 变量的位置:

    gdb (gdb) n # 逐行执行,直至到达定义 'head' 变量的位置
  5. 打印 head 变量:在正确的上下文中打印 head 变量的值:

    gdb (gdb) p head

    这将输出 head 变量的地址,例如:

    gdb $1 = (Node *) 0x5555555592a0
  6. 检查链表节点:打印链表的节点数据。假设 head 是链表的头节点,可以打印它及其后续节点的内容:

    gdb (gdb) p *head # 打印 head 节点的数据 (gdb) p *(head->next) # 打印下一个节点的数据 (gdb) p *(head->next->next) # 打印下下一个节点的数据

    输出示例:

    gdb $2 = {data = 1, next = 0x5555555592c0} $3 = {data = 2, next = 0x5555555592e0} $4 = {data = 3, next = 0x0}

总结

  1. 编译程序:确保使用 -g 标志编译程序。
  2. 启动 gdb:使用 gdb 附加到程序。
  3. 设置断点:在 main 函数的入口处设置断点。
  4. 运行程序:运行程序并在断点处停止。
  5. 逐行执行:逐行执行程序,直至访问 head 变量。
  6. 打印和检查变量:打印 head 和链表节点的数据。

通过以上步骤,你可以在 gdb 中成功查看和调试进程内存中的数据结构。

标签:Node,head,next,链表,gdb,内存,数据结构,节点
From: https://www.cnblogs.com/zhanchenjin/p/18404245

相关文章

  • 数据结构-堆-详解
    数据结构-堆-详解1.性质大根堆小根堆2.实现2.1structHeap、HeapInit、HeapDestroy2.2HeapPushAdjustUp2.3HeapPopAdjustDown2.4HeapTop、HeapSize、HeapEmpty3.应用3.1堆排建堆排序3.2TopK问题1.性质堆是一种特殊的完全二叉树,其父节点总是不大于/不小于子节......
  • 算法与数据结构——堆
    堆堆(heap)是一种满足特定条件的完全二叉树,主要分为两种类型:小顶堆(minheap):任意节点的值≤其子节点的值大顶堆(maxheap):任意节点的值≥其子节点的值堆作为完全二叉树的一个特例,具有以下特性:最底层节点靠左填充,其他层的节点都被填满我们将二叉树的根节点称为“堆顶”,将......
  • 数据结构题目 第一章
    题目1、数据结构被形式的定义为(K,R),其中K是( )的有限集合,R是K上关系的有限集合。A.算法  B.数据元素 C.数据操作 D.逻辑结构2、数据元素是数据的最小单位。 ( )3、存储数据时,通常不仅需要存储各数据元素的值,而且还要存储( )。A.数据的处理方法 B.数据元素的类型......
  • 【高阶数据结构】秘法(二)——图(一):图的基本概念和存储结构
    前言:今天我们要讲解的是数据结构中图的部分,这部分在我们实际生活中也是经常会碰到的,同时这部分也是数据结构中比较有难度的部分,这部分内容我会把它分为多章来进行讲解,今天我们先来讲解一下图的基本概念和存储结构目录一、图的基本概念1.图的定义2.术语解释3.图的分......
  • JavaScript高级——数据、变量、内存
    1、数据存储在内存中代表特定信息的东西,本质上是010101…….数据的特点:可传递、可运算一切皆数据内存中所有操作的目标:数据操作包括:算术运算、逻辑运算、赋值、运行函数(调用函数传参)。2、内存内存条通电后产生的可存储数据的空间(临时的)内存产生和死亡:内存条(电路板)——> ......
  • 【数据结构】栈与队列OJ题(用队列实现栈)(用栈实现队列)
    目录1.用队列实现栈oj题对比一、初始化二、出栈 三、入栈四、取队头元素:2.用栈实现队列 一、定义二、入队列三、出队列四、队头五、判空                                      ......
  • Go进阶概览 -【2.4 切片的结构与内存管理】
    2.4切片的结构与内存管理切片是我们日常使用比较多的一个结构,深入的了解它的结构对于我们提高程序性能也有比较大的帮助。本节我们将针对切片底层结构、扩容机制、底层数组进行讲解。本节代码存放目录为lesson4切片底层结构我们在使用的时候发现切片与数组很相似,这是......
  • C++笔记19•数据结构:红黑树(RBTree)•
    红黑树1.简介:    红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。当搜索二叉树退化为单支树时,搜......
  • 整数在内存中的存储(含整型提升的详解)
    整数在内存中的存储整数的2进制表示法有三种,即:原码、反码和补码有符号的整数,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,最高位的⼀位是被当做符号位,剩余的都是数值位。           正整数的原、反、补码都相同。      ......
  • 25版王道数据结构课后习题详细分析 第八章 8.4 选择排序
    一、单项选择题————————————————————————————————————————解析:正确答案:————————————————————————————————————————解析:正确答案:——————————————————————......