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

1、监视局部变量

    在GDB中,能够通过调用info locals命令得到当前桟帧中的全部局部变量的值的列表。

2、直接检查内存

      在有些情况下。可能希望检查给定地址的内存,而不是通过变量的名称。

GDB为这样的目的提供x命令。

      print和display的高级选项,print和display命令同意指定可选的格式。比如p /x y,这样会以十六进制格式显示,而不是十进制格式,其他经常使用的格式为c(字符)。s(字符串)。f(浮点数)。

       假设你想禁用某一个选项。GDB提供了dis命令,dis disp number假设条目你不记得,那你一定要使用info disp来查看条目。大家知道,假设有禁止。就肯定会有启用,启用命令当然是大家熟知的enable,如enable disp number,假设想全然删除某个条目。那么就要是用命令undisplay 如undisp number。

3、给变量赋值

       GDB測试时使用set命令对变量赋值,比方 set x=12,这就是将x的值设置成12。

GDB中能够使用set args命令设置程序的命令行參数。

在调用run命令检查函数參数的命令info args。GDB还能够定义自己的变量,GDB的print命令的输出值被标为$1。$2。这些值统称为值历史。如$1=(struct node*)0x80496a8àprint tmp->left

       在调试链表时,有时须要查看链表中的每一个结点的值,这时能够使用GDB中的方便变量:设一个指针变量p。它在不同的时候指向链表中的不同节点。能够记录这个结点的值为set $q = p,后能够运行p *$q。这里的变量$q称为方便变量(convenience variable)。比如:

w[4] = {12, 5, 8, 29}

set $i = 0

p w[$i++]

4、程序崩溃处理

       程序崩溃通常是因为未经同意,訪问了内存单元,也就是我们经常看见的段错误,相信大家对段错误(Segment default)并不陌生。

4.1 程序在内存中的布局


4.2 信号含义

        操作系统有时发送信号给程序,信号发送的机制是操作系统将信号记录在进程表中,而不是实际上的发送信号。

操作系统中的每种信号代表了不同的含义:

        SIGFDE信号:浮点异常导致、算数异常、溢出或除0。总线错误、对齐问题,物理内存不存在相应的信号是SIGBUS信号,SIGBUS会导致转存内存并终止。

4.3 核心文件(core文件)

        大家应该都看到过这个文件。特别是那些使用gdb对安卓系统中的软件进行gcore的时候见的最多了,只是那个不是程序崩溃了,而是为了分析代码。

有些信号表示让某个进程继续是妥当,甚至是不可能的,在这样的情况下,默认动作是提前终止进程,并编写一个名为核心文件(core file)的文件,俗称转储核心。

        核心文件包括程序崩溃时对程序状态的具体描写叙述,桟的内容(或者,假设程序是多线程的。则是各个线程的桟)。CPU寄存器的内容(多线程,则是线程的一组寄存器的值),程序静态分配变量的值(全局与static变量)

        File core能够查看这个特定核心文件的名称,在bash中,能够使用ulimit命令控制核心文件的创建。如:

        ulimit –c n : n是核心文件的最大大小,以千字节为单位。超过nKB的不论什么核心文件都不会被写。

假设是创建随意大小的核心文件则:

        ulimit –c unlimited,ulimit – c能够检查核心文件。

5、vim技巧

        假设使用vim进行project开发,是不是每次退出vim进行make比較麻烦,这里有个技巧能够避免退出vim,适用于单个没有makefile的代码。或者是有makefile的project。在vim的命令行直接输入:make就能够直接编译了,假设程序有错误,能够使用:cnext或者cprev命令查看错误。

有没有认为非常方便。大笑大笑大笑

posted @ 2017-08-13 13:32  yxysuanfa  阅读(147)  评论(0编辑  收藏  举报