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

1、命令+条件中断和监视点的使用

1.1   监视点

监视点是指示GDB每当某个表达式改变了只,就暂停执行指令。如watch i它会使得每当i改变值时GDB就暂停。也可以使得watch后面的更复杂如:watch (I | j > (2) && I > 24) && strlen(name)> 6这是将监视点看作“附加”在表达式上,当表达式的值改变时,GDB会暂停程序的执行。

1.2   监视点和断点的区别

断点与源代码中的一个位置关联,监视点则是对与内存,当变量不存在时,GDB自动删除监视点。

1.3   使用监视点

监视点的使用形式如watch var,GDB实际上在var的内存位置改变值时中断。

1.4   监视点的使用场景

监视点使用的最多的地方是对于指针的监视,对于C、C++这样的指针型语言,可能对指针进行修改,这是时候watch可以有效的监视指针。形如:p =&y; p = &x监视y可以知道值是在何处被修改的,防止不必要的错误。

1.5   结构体的输出

对于C这样的语言,在工程中少不了使用结构体,但是我们在GDB调试的时候每次都比较麻烦,为了打印结构体里面的变量,我们要重复的输入ptempstruct->value的表达式。不过还好有简单的方法如下。

1、         print *tmp:tmp是指针结构,tmp指向结构体,因此*tmp是这个结构体本身,这样能输出结构体的所有变量。

2、         使用GDB的display命令:如果知道会在每次遇到断点时键入这个命令,那么使用GDB的display命令(简写disp),这个命令要求GDB在执行中每次有暂停(由于有断点,使用next、step命令等)时就输出指定条目。

3、         使用GDB的commands命令,在给定点上时查看子结点的值。下面是对数据结构中的二叉树的输出。

commands 1

p tmp->val

if (tmp->left != 0)

ptmp->left->val;

else

printf“%s\n” “none”

end

if (tmp ->right != 0)

ptmp->right->val;

else

printf“%s\n” “none”

end

end

4、         使用GDB的call,可以对现有代码进行调用函数,调试中的一个常见方法是隔离出现问题的第一个数据项。在上下文中,可以通过每次完成对insert的调用时输出整个树来完成这件事情。

command 2

printf “*******current tree *********”

call printtree(root) printtree是我们自己写的函数

end

DDD中可以使用ddd –separate bintree来分离窗口,为了使调试更为方便和直观。

2、 动态数组的检查

在编程中我们常常会使用动态数组,例如:

int x[25];

print x

int *x;

x = (int *)malloc(25 * sizeof(int));

p x         这时只会打印x[0]的值。怎样才能输出x数组中的所有值呢?

解决方法:在GDB中,可以通过创建一个人工数组(artificial array)来解决这个问题。如:

int *x;

main()

{

x = (int*)malloc(25 * sizeof(int));

x[3] = 12;

}

可以使用p *[email protected]可以将动态数组里面的数据全部打印出来。

人工数组的形式:*[email protected],GDB还允许在适当的时候使用类型强制转换,比如:p (int[25])*x进行打印。

3、  C++中对象的调试

对于C++来说,如果使用了对象来建立二叉树则在node中不能使用p *root来打印,这是会报错:can notaccess memory at address,用print打印也得换一种形式如p *node::root这样才能打印出来,因为root是class node的对象。

时间: 2024-10-26 22:16:58

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

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

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

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

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