食梦者

一个底层程序员往上走的路程

排序:
默认
按更新时间
按访问量

GDB——GDB中一些调试中的小技巧

除了之前介绍的一些常用用法,GDB还有许多其他的功能,也是方便我们使用的。 技巧示例:断点处自动打印 (gdb) start Temporary breakpoint 1 at 0x804846f: file tricks.c, line 33. Starting program: /ho...

2018-06-13 17:03:32

阅读数:66

评论数:0

GDB——使用GDB查看栈帧信息

当我们阅读代码和查找BUG时,往往有一个烦恼。就是我们不知道函数的调用顺序。而这些函数调用顺序对应我们理解程序结构,程序运行过程是很有帮助的。 那么问题是:程序的调用过程往往是很复杂的,而且可能是多层嵌套,跨文件调用的。这时候如果靠人工去查找,这将是一件非常大工作量的事情。GDB中有办法帮...

2018-06-13 17:02:01

阅读数:939

评论数:0

GDB——使用GDB查看内存

我们可以使用GDB来进行对指定内存地址进行查看。 命令语法: x /Nuf experssion - N – 需要打印的单元数 - u – 每个单元的大小 u对应的意义: f – 数据打印的格式 f对应的意义: 查看指定内存的作用 这样查看指定内存数据有什么作用呢?为什...

2018-06-13 17:00:07

阅读数:257

评论数:0

GDB——使用GDB实时监控变量

示例代码: #include <stdio.h> #include <pthread.h> #include <unistd.h> int g_var = 0; ...

2018-06-13 16:58:20

阅读数:883

评论数:0

GDB——使用GDB验证代码的正确性

在软件开发中,不可避免的会产生BUG。这样我们就需要频繁的查找问题,修改代码,验证代码正确性。这样就需要我们不断的修改代码,编译代码。这样的话就白白浪费了需要时间。 GDB为我们提供了解决方案,我们可以实时修改有问题的代码,验证一下代码是否正确,再修改源代码。 示例过程: (gdb) sta...

2018-06-13 16:57:32

阅读数:36

评论数:0

GDB——使用GDB动态链接到进程

GDB支持链接到一个正在运行的进程。一遍检测它的运行状态。 示例过程: Bakuman@Shaw-vm:~$ su 密码: root@Shaw-vm:/home/delphi# cd workspace/ root@Shaw-vm:/home/delphi/workspace# ls C...

2018-06-13 16:56:06

阅读数:74

评论数:0

GDB——GDB的断点调试

那么我们应该如何使用GDB呢?GDB为我们提供了什么样的功能呢?我们可以参照图形界面调试器的基本功能,使用GDB来实现。例如: 问题:我们如何使用GDB设置断点,删除断点的操作? - 通过函数名设置断点 1. break func_name [ if var = value ]...

2018-06-13 16:54:52

阅读数:140

评论数:0

GDB——GDB调试工具简介

什么是GDB? GDB的常规应用 GDB的启动方式 什么是GDB? GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。与Window下的IDE不同,GDB是纯命令行执行的,并没有图形界面方法。 问题:既然windows下有对用户友好的图形界面的调试工...

2018-06-12 19:58:05

阅读数:90

评论数:0

binutils——如何找到内存中的内存错误

addr2line Addr2line示例:定位0地址访问 1.开启core dump选项 2.运行程序,并生成崩溃的core文件 3.读取core文件,获取IP寄存器的值 4.使用addr2line定位代码行 strip 问题:我工程项目中,经常会出现内存操作错...

2018-06-12 19:56:28

阅读数:43

评论数:0

binutils——如何将程序打包为库文件

静态库文件 动态库文件 静态库与动态库的区别 在我们开发项目过程中。经常会遇到使用第三方程序的情况。而这个时候我们只需要调用第三方提供的库文件和接口文档就可以了,我们并看不到源代码。而这个库文件又是许多源文件编译得来的。 问题:我们如何将多个源文件打包成一个库文件呢...

2018-06-12 19:55:13

阅读数:58

评论数:0

binutils——查看可执行文件中包含的信息

nm 段标识符说明: size strings objdump objdump–h 的输出说明 有时候我们知道我们编译出来的可执行文件中包含了什么。方便我们查找问题。但是可执行文件又不可以直接打开。 那么我们可以使用什么工具来查看可执行文件包含的信息呢? ...

2018-06-12 19:53:31

阅读数:43

评论数:0

binutils——GCC的辅助工具集

什么是开发环境? 构建环境 调试环境 测试环境 Binutils工具集 工具名 功能简介 什么是开发环境? 构建环境 编写代码,程序编译,版本控制(可选) 版本控制多数在公司中使用,个人开发我们常常使用备份的方式来保存之前的版本。常用版本控制有:SVN...

2018-06-12 19:50:03

阅读数:48

评论数:0

通过机制解决问题的设计原则

核心:考虑当前设计是否存在“漏洞” 意图:杜绝类似问题的再次发生 案例:消息传递 例如有A设备和B设备。两个设备需要进行通信。 问题:当A设备无法收到B设备的RSP消息时,会发生什么? 当A设备无法收到RSP消息时,就无法发送ACK消息给设备B,然后两个设备的就进入...

2018-06-10 23:44:17

阅读数:55

评论数:0

重视运行时数据的收集的设计原则

-核心:考虑程序运行状态数据的收集模块 - 意图:监控程序运行状态,便于调试与测试 案例:统一日志模块的设计 在软件开发中,免不了需要进行调试,和数据的输出。而这个时候软件的各个模块都需要带有这个功能。所以我们就可以将这些共有的东西,抽取出来,独立设计成一个模块,进行统一的管理。 ...

2018-06-10 23:41:29

阅读数:35

评论数:0

让模块善始善终的设计原则

核心:模块的初始化与模块的终止同等重要 意图:确保模块状态的恢复和保存 要点:对称式设计 案例:模块的动态加载(初始化)与卸载(终止) 一般嵌入式软件的设计都需要进行开机初始化配置,在关机前,需要保存用户的设置。所以我们需要有始有终。 问题:那么如何强制使开发人员遵循这个原则呢...

2018-06-10 23:40:03

阅读数:38

评论数:0

简单即是美的设计原则

方案一:使用正则表达式 方案二:使用C语言方式 方案三:使用C++字符串类方式 简单性 VS 灵活性 核心:用最简单的方法描述解决方案 意图:便于沟通和理解,降低复杂性,增加维护性 要点:使用团队熟悉的技术进行设计 案例:删除格式化字符串中的指定子串 例如:abc...

2018-06-10 23:37:42

阅读数:50

评论数:0

以人为本的设计原则

本文参考自狄泰软件学院——《12月门徒计划》 核心:将现实世界直接映射到软件世界 意图:便于沟通和理解,降低复杂性,增加维护性 要点:使用现实世界中的概念 案例:任务与内存访问 TaskA可以访问Memory1内存和Memory2内存; TaskB可以访问...

2018-06-10 23:34:09

阅读数:149

评论数:0

什么是软件质量?

从用户角度来看 从开发的角度来看 如何提高软件质量? 为测试正名 开发中的常见问题和偏见 如何提高自身的软件设计能力? 一说到软件质量,很容易想到软件缺陷。因此,缺陷少就潜移默化地成为了高质量软件的代名词。但这种认识是片面的。 从用户角度来看 defect 和 bu...

2018-06-10 23:26:33

阅读数:1069

评论数:0

软件设计是什么?

软件设计的意义(架构的意义) 关于软件设计的问题 软件设计的特点 软件设计时一系列创造活动,是借助编程语言以简单和优雅的方式表达并解决现实需求的一门科学和艺术。 - 软件设计是一门技术 数据结构,组成原理,操作系统,编程语言… 科学的特点是有规律可循,因此软件设计者需...

2018-06-10 23:25:32

阅读数:1032

评论数:0

C语言的内存管理——动态内存分配

本文来自狄泰软件学院——《C语言深度剖析课程》 动态内存分配的意义 malloc和free calloc和relloc 动态内存分配的意义 C语言中的一切操作都是基于内存的 变量和数组都是内存的别名 内存分配由编译器在编译期间决定 定义数组的时候必须指定数组长度 数组...

2018-06-07 09:12:15

阅读数:56

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭