《软件调试艺术》读后感七

2023-11-07

1、 线程调试

        对线程的调试用的最多的可能是thread命令了,查看程序中有多少线程使用Infothreads,进入到某个线程的内部使用thread count,这样就可以进入到count线程的内部。线程调试中用的最多的还有就是bt命令,这个命令主要是查看线程的桟信息,光看桟信息还是差了点什么,那就是使用frame count命令,这个命令可以在桟帧之间移动,如果要查看这个桟的源代码就用到之前我们使用的list。在frame中使用的多的还有up和down命令,可以顺序切换桟的frame。

        GDB能够使用进程号或者是线程号动态的将调试器附加到已经运行的进程上,用ps命令来确定系统上现在运行的程序。

        对线程下断点、监视点等都和前面的进程一样,没有任何区别,只是如果线程出错,每个线程里面都会有一个拷贝的errno变量记录了线程的错误。

2、perror或strerror查看错误

        perror函数接受一个参数,且没有返回值,它输出字符串,后面跟一个冒号和空格。

        strerroràchar *strerror(int errno)以errno做为参数,并返回一个描述错误的字符串。

3、 strace命令和ltrace命令

        strace实用程序输出程序进行的各个系统调用及其参数和返回值-o logfile输出到文件,或-s N选项截断为N个字符。多线程中使用-o log –ff切换,将单个子进程的strace输出捕获到一个名为log.xxx的文件中,其中xxx是进程ID。

        ltrace显示库调用,而不是系统调用。

        ldd命令可以查看可执行程序需要的库文件。

4、 调试GUI程序

        调试GUI,启动GDB,这次不同之处在于告诉GDB程序在不同中断窗口中执行,而不是GDB在运行的那个窗口,在窗口中运行tty命令确定窗口的ID号,所以(gdb) tty/dev/pts/X,现在该程序的所有键盘输入和屏幕输出都将在执行窗口,这时可以在执行窗口中执行类似一下功能的命令sleep xxxx,其中xxxx是睡眠,不接收输入。这样在该窗口中的键盘输入会进入程序,而不是shell命令窗口。

        或者使用另一种方法,让程序先执行,打开另一个窗口运行gdb,然后附加上这个运行的程序。

5、  调试助跑

5.1 splint的使用

        使用splint对程序静态检查,可以对程序包括返回值在内的检查,使用之前先进行安装,debian系统用apt-get install,如果不记得程序的名称,可以使用apt-cache search搜索后再安装。如果是红帽系列应该使用yum命令查找并安装。该程序提供了几种不同的检查功能,严格控制程度不同分别有standard默认选项,checks是中度检查,strict是高度严格检查。如果使用某个功能使用+,不使用某个功能使用-。例如splint +weak *.c。

put.c

#include <stdio.h>

int main(void)
{
    int i;
    scanf("%d", &i);
    
    return 0;
}
        使用splint检测,默认的话会提示你scanf有返回值,你没有接收,如果使用+weak之后就不会提醒。

5.2 ElectricFence的使用

        该软件所提供的功能是内存方面的检查,可以是越界,重复释放,访问错误,内存泄漏等。内存越界检查在gcc中也提供了这个功能,只是gcc中是以宏的形式表现出来的。编写程序的时候有时会把访问数组的个数弄错,导致越界访问,越界访问并不一定表现出任何错误。这也是最可怕的,所以使用该软件联合编译会检查你的程序,数组有没有越界,如果越界,编译执行会出现段错误并打印出错误的地方。例如:gcc –g3 –Wall –std=c99 outofband.c –o outofband  –lefence,efence默认只捕获越出动态分配区域最右一个元素的读或写。

outofbound.c

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

int main(void)
{
    int *a = (int *)malloc(2 * sizeof(int));
    for (int i = 0; i <= 2; i++)
    {   
        a[i] = i;
        printf("%d\n", a[i]);
    }   
    
    free(a);
    return 0;
}

6、VIM使用技巧

k查询man页中的函数,在程序中直接使用k查看。

gd和gD查找变量声明。

[^D和]^D跳到宏定义。

]d,[d,[D,]D显示宏定义。


总结

      《调试软件艺术》的读书笔记到此也就完成了,希望大家能够从中得到你想知道的调试技巧。如果有任何错误,希望大家指正。谢谢大笑大笑

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《软件调试艺术》读后感七 的相关文章

随机推荐

  • java项目-谷粒商城(持续更新ing)

    使用docker安装nacos 我是直接在网上找的教程 17条消息 Docker下载安装Nacos并完成持久化配置 docker nacos 下载 虫链Java Library的博客 CSDN博客 在项目中导入依赖 在 common 项目中
  • [0x7FFE1E17E050] ANOMALY: meaningless REX prefix used

    今天要记录一下糟糕的事情 遇到一个很是 cao dan 的问题 再用git时 报错了 0x7FFE1E17E050 ANOMALY meaningless REX prefix used 在cmd窗口输入 也报这个错 idea中也报错 gi
  • 云原生——云平台操作

    作者介绍 奇妙的大歪 个人名言 但行前路 不负韶华 个人简介 云计算网络运维专业人员 前言 云 云是网络 互联网的一种比喻说法 平台 即操作系统 数据库和一些中间件都可称为软件平台 云计算 使用互联网接入存储或者运行在远程服务器端的应用 数
  • 3dsMax2016卡死的一种解决办法

    可能是升级win10版本的时候 win10自带的输入法也升级了 然后3dsMax2016就卡死了 设置一下输入法的兼容性
  • Vue基础知识总结 7:插槽slot与vue导入导出

    作者简介 哪吒 CSDN2021博客之星亚军 新星计划导师 博客专家 哪吒多年工作总结 Java学习路线总结 搬砖工逆袭Java架构师 关注公众号 哪吒编程 回复1024 获取Java学习路线思维导图 大厂面试真题 加入万粉计划交流群 一起
  • 基于matlab实现信号的线性卷积与循环卷积

    系列文章目录 数字信号处理 DSP Digital Signal Process 是电子通信领域非常重要的研究方向 博主汇总了数字信号处理 DSP 中常用的经典案例分析 主要基于算法分析 MATLAB程序实现 信号图像显示 对数字信号处理的
  • python flask框架下登录注册界面_基于Flask框架如何实现用户登录功能

    form hidden tag form username class form control input lg placeholder 用户名 form password class form control input lg plac
  • dubbo解析-@EnableDubbo注解详解

    本文基于dubbo 2 7 5版本代码 文章目录 一 EnableDubbo注解功能 二 详细介绍注解引入的三个类的作用 dubbo必须配置注解 EnableDubbo 一 EnableDubbo注解功能 EnableDubbo整合了三个注
  • MetaFormer/PoolFormer学习笔记及代码

    MetaFormer PoolFormer学习笔记及代码 MetaFormer Is Actually What Y ou Need for Vision code https github com sail sg poolformer A
  • RN仿微信朋友圈图片拖拽删除

    目录 前言 初始时 渲染时 开始拖拽 拖拽中 拖拽结束 拖拽删除 参考链接 前言 之前负责的一个需求 让在RN端做仿微信朋友圈的图片删除和排序 由于经验和时间限制 就跟PM协商改为点击删除 由此欠下一个技术栈 今天是来还债的 本文基于tra
  • STM32 电机教程 16 - PMSM电机磁场定向控制原理

    前言 磁场定向控制又称矢量控制 FOC 本质上为控制定子电流的幅度和相位 使之产生的磁场和转子的磁场正交 以产生最大的扭矩 1 PMSM 的磁场定向控制 磁场定向控制 Field Oriented Control FOC 表示这样一种方法
  • 计算机网络应用层之HTTP协议

    一 什么是HTTP协议 HTTP是HyperText Transfer Protocol即超文本传输协议的缩写 是Web应用层协议之一 HTTP协议由两部分程序实现 一个客户机程序和一个服务器程序 它们运行在不同的端系统中 通过交换HTTP
  • Java SPI 机制

    文章首发于个人博客 欢迎访问关注 https www lin2j tech 什么是 SPI 机制 SPI Service Provider Interface 是 Java 内置的一种服务提供发现机制 将功能的实现交给第三方 用来拓展和替换
  • Python 中的 retrying 库

    文章目录 retrying 模块 一 简介 二 使用方法 1 无参数 2 有参数 2 1 stop max attempt number 2 2 stop max delay 2 3 wait fixed 2 4 wait random m
  • 2018.6.20 Java考试试题总结(Java语言基础与面向对象编程)最新版

    Java考试试题总结 一 单选题 每题1分 50 50分 1 java程序的执行过程中用到一套JDK工具 其中javac exe指 B A java语言解释器 B java字节码编译器 C java文档生成器 D java类分解器 2 在J
  • 华为OD机试 - 连续出牌数量(Java)

    题目描述 有这么一款单人卡牌游戏 牌面由颜色和数字组成 颜色为红 黄 蓝 绿中的一种 数字为0 9中的一个 游戏开始时玩家从手牌中选取一张卡牌打出 接下来如果玩家手中有和他上一次打出的手牌颜色或者数字相同的手牌 他可以继续将该手牌打出 直至
  • 测试圈的网红工具:Jmeter到底难在哪里?!

    雨果的公司最近推出了一款在线购物应用 吸引了大量用户 然而随着用户数量的增加 应用的性能开始出现问题 用户抱怨说购物过程中页面加载缓慢 甚至有时候无法完成订单 小欧作为负责人员迫切需要找到解决方案 在学习JMeter之前 小欧只能通过手动测
  • 【画方】画方网络准入管理系统

    一 DHCP Server与DHCP准入方式 NAM内置了一个DHCP服务器 它与其它模块配合来提供DHCP准入控制功能 这个服务器与标准DHCP服务器有很大区别 它不仅利用DHCP协议实现了IP地址的中心下发功能 还利用操作系统内置的DH
  • 神经网络算法基本原理及其实现

    目录 背景知识 人工神经元模型 激活函数 网络结构 工作状态 学习方式 BP算法原理 算法实现 MATLAB 背景知识 在我们人体内的神经元的基本结构 相信大家并不陌生 看完下面这张图 相信大家都能懂 什么是人工神经网络 人工神经网络是具有
  • 《软件调试艺术》读后感七

    1 线程调试 对线程的调试用的最多的可能是thread命令了 查看程序中有多少线程使用Infothreads 进入到某个线程的内部使用thread count 这样就可以进入到count线程的内部 线程调试中用的最多的还有就是bt命令 这个