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

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显示宏定义。

总结

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

时间: 2024-10-23 05:35:14

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

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

1.预备知识 在进入正题之前要对GDB有一个大概的了解,GDB能干什么?GDB现在的实用性还有多少?等问题,我们带着这样的问题去书中探索,这样会使我们学到更多的东西. 首先,我看一张图,这张图不是我画的,但是这张图基本涵盖了<软件调试艺术>这本书的所有内容.也就是这本书的浓缩版,精华版. 这本书主要以GDB调试软件为基础进行讲解,可能在此之前我们大家对调试并不关注,或者都没有觉得调试有多重要.我们总是写代码,这些代码的工程比较小,代码量少,所以调试工具没有太大的帮助.如果我们的程序非常的大,并

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

1.监视局部变量 在GDB中,可以通过调用info locals命令得到当前桟帧中的所有局部变量的值的列表. 2.直接检查内存 在有些情况下,可能希望检查给定地址的内存,而不是通过变量的名称.GDB为这种目的提供x命令. print和display的高级选项,print和display命令允许指定可选的格式.例如p /x y,这样会以十六进制格式显示,而不是十进制格式,其它常用的格式为c(字符),s(字符串),f(浮点数). 如果你想禁用某一个选项,GDB提供了dis命令,dis disp nu

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

1.   GDB调试基础 GDB可以对各种源代码行.代码地址.源代码文件中的行号或函数的入口等.之所以GDB可以对可执行文件进行调试,是因为在源代码编译成可执行文件时使用了gcc命令中的-g选项,这个选项告诉编译器,在编译成可执行文件是保留符号表.而符号表是GDB能够调试的关键,里面包含了源代码和行号的对应关系,当GDB进行调试时可以看到调试的位置.GDB使用ctrl + x + a快捷键可以将gdb的界面改变成界面的形式,如果再次使用这个快捷键,则会切换回去.Ctrl + x + a的界面图:

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

1.命令+条件中断和监视点的使用 1.1   监视点 监视点是指示GDB每当某个表达式改变了只,就暂停执行指令.如watch i它会使得每当i改变值时GDB就暂停.也可以使得watch后面的更复杂如:watch (I | j > (2) && I > 24) && strlen(name)> 6这是将监视点看作"附加"在表达式上,当表达式的值改变时,GDB会暂停程序的执行. 1.2   监视点和断点的区别 断点与源代码中的一个位置关联,

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

1. GDB调试技 在谈这个问题前我们有没有遇到过这种场景,每次要改动一次代码,然后make,之后gdb调试,然后出gdb中quit,再次改动再次make再次gdb进入再次quit一直反复着一个工作.那有没有方法能够避免这种反复事情呢?毕竟程序猿对这种反复的步骤非常反感. 避免的方法例如以下:在我们对代码改动和编译时另外开一个窗体,这个窗体专门用来改动和编译.GDB调试窗体不要关闭.当在gdb命令行以下输入run(r)命令时.gdb可以又一次载入新编译的程序. 这时里面设置的断点都还存在,这里的

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

1.条件断点 仅仅有符合某种条件时才在断点处停止. 类似于监视点的工作方式,每当该变量的值发生变化时,监视点都会中断.条件断点仅仅会在怀疑有问题的代码处当变量呈现该怀疑值时才中断. 设置条件断点:breakbreak-args if (conditon)如:break if (i==700) condition 6999 条件能够是: 1.         相等.逻辑和不想等运算符(<,<=,==,!=.,>.>=.&&,||等)如break 180 if stri

《软件调试的艺术》笔记--停下来环顾程序

1.断点列表 创建的每个断点(包括断电.监视点和捕获点)都标识为从1开始的唯一整数标识符.这个标识符用来执行该断点上的各种 操作.调试器还包含一种列出所有断点及其属性的方法. 调试下面的代码:(代码1) #include <stdio.h> void display(int i) { i = i + 1; printf("i = %d\n",i); } int main(void) { int i = 1; display(i); return 0; } 设置断点--显示断

《软件调试的艺术》笔记--预备知识

1.gcc的-g选项 如果要使用gdb进行调试,必须在编译时在gcc中加入-g选项,使用参数 -g 表示将源代码信息编译到可执行文件中. 如果不使用-g选项: #include <stdio.h> int main(void) { int i = 1; i = i + 1; printf("i = %d\n",i); return 0; } gcc main.c gdb a.out (gdb) b main Breakpoint 1 at 0x4004f8 (gdb) r

《软件调试的艺术》笔记--调试多线程程序

下面是于线程相关的GDB命令用法汇总: info threads:给出关于当前所有线程的信息. thread 3:改成线程3. break 88 thread 3 :当线程到达源代码88时停止执行. break 88 thread 3 if i == 2 当线程3到达源代码行88行,并且变量i的值为2时停止执行. 对下面的多线程进行调试: #include <stdio.h> #include <pthread.h> #include <string.h> #inclu