20 岁,是学生

手撸调试器(1) —— 载入 inferior

近几天放假无事可做,便开始翻 Linux 中国的微信公众号找乐子,在他们的推送里,我发现了这篇文章,看完后有了想要自己写一个玩具调试器玩玩的想法。于是就有了这个系列的文章。

在正式开始写调试器之前,我们先要了解下 inferior 的概念,在 gdb 里面,inferior 表示的是被调试的东西。它可能是一个进程,可能是运行在一个虚拟机上的内核,也可能是运行在通过各种方式与这台计算机连接起来的远程设备上的进程。我们要写的调试器的作用,就是帮助用户检测程序的错误。我们在本系列文章中实现的调试器大致支持的功能有如下几个:设置断点、暂挂已启动的程序、单步执行代码和检查变量的内容 —— 这几个功能也是我在使用 gdb 时候常用的几个初级功能。

2018-07-30 C
Link

当你 malloc(0) 时会发生什么

故事要从今天中午一位同学提到了这个问题开始……

5b572595b42f1

2018-07-24 C
Link

详解 C 语言链表(应用篇) -- 浅析 Linux kernel 中的 list.h 头文件(二)


注: 本文分析的为文章发布时最新的 Linux 内核源码。


2018-03-17 C
Link

详解 C 语言链表(应用篇) -- 浅析 Linux kernel 中的 list.h 头文件(一)

中国人有一句老话:“不入虎穴,焉得虎子。”这句话对于人们的实践是真理,对于认识论也是真理。离开实践的认识是不可能的。

                                             ---- 毛主席 《实践论》

计算机学科是一门实践性比较强的学科。这就意味着,搞计算机需要进行足够的实践。而回头看历史,计算机多年来的发展历程也是如此。人们从实践中发现理论,理论再指导新一轮的实践,循环往复,最终推动了技术的发展。

在前两篇文章中,我们讲述了基础的链表的实现方式。又留下了几个很有启发意义的习题,在本篇文章里面,我们来看简要地一下链表这一数据结构在 Linux 内核中的实际应用。

2018-03-17 C
Link

详解 C 语言链表(实践篇)

基础篇中,笔者介绍了一些链表的基本操作。在本文中,笔者整理了几个有关链表的问题供大家练习。练习的难度是递增的。前几道非常简单,后面就会愈加困难。答案会附在题目的后面。

注意:仅仅用眼睛看答案不会提升自己的水平,只有自己亲手实现,才算真正的学到了知识。在看答案之前,无论你自己有没有成功实现,都请务必确保你真的认真思考了。

优秀的程序员应该是能够将数据结构可视化的,因此他们能够很好的理解代码运行时内存的变化。链表的规整使得它很适合拿来做基本的可视化训练。在解决下面这些问题时,你可以尝试在纸上画出链表的结构进行模拟,最终使用代码将之表达起来。

2018-03-16 C
Link

详解 C 语言链表(基础篇)

链表基础

复习:数组

链表和数组的作用相同。都是用来存储数据。因此,使用数组和链表进行类比是一个不错的选择。

数组是很常用的数据结构。在多数语言中,我们都可以很容易的声明一个数组类型,并使用 [] 符号取出其中的元素。 C 语言的示例如下:

1
2
3
4
5
6
7
8
void ArrayTest(void) {
int fuc[100]; // 定义数组

// 数组操作
fuc[0] = 1;

printf("%d\n",fuc[0]);
}
2018-03-14 C
Link

【译】C Puzzles —— 有趣的 C 语言问题

原文来自:C PUZZLES, Some interesting C problems

本文文末有笔者的答案。

注意:原文中原作者和笔者使用的环境均为 linux + gcc,笔者的答案亦以此为准。

2018-01-29 C
Link