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

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(使用前将#替换为@)

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

  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 用于登录 .NET 的堆栈跟踪

    我编写了一个 logger exceptionfactory 模块 它使用 System Diagnostics StackTrace 从调用方法及其声明类型中获取属性 但我注意到 如果我在 Visual Studio 之外以发布模式运行代
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐

  • 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命令 这个