《软件调试艺术》读后感六
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命令查看错误。
有没有认为非常方便。