在GDB中,可以通过调用info locals命令得到当前桟帧中的所有局部变量的值的列表。
在有些情况下,可能希望检查给定地址的内存,而不是通过变量的名称。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。
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++]
程序崩溃一般是由于未经允许,访问了内存单元,也就是我们常常看见的段错误,相信大家对段错误(Segment default)并不陌生。
操作系统有时发送信号给程序,信号发送的机制是操作系统将信号记录在进程表中,而不是实际上的发送信号。操作系统中的每种信号代表了不同的含义:
SIGFDE信号:浮点异常导致、算数异常、溢出或除0,总线错误、对齐问题,物理内存不存在对应的信号是SIGBUS信号,SIGBUS会导致转存内存并终止。
大家应该都看到过这个文件,特别是那些使用gdb对安卓系统中的软件进行gcore的时候见的最多了,不过那个不是程序崩溃了,而是为了分析代码。有些信号表示让某个进程继续是妥当,甚至是不可能的,在这种情况下,默认动作是提前终止进程,并编写一个名为核心文件(core file)的文件,俗称转储核心。
核心文件包含程序崩溃时对程序状态的详细描述,桟的内容(或者,如果程序是多线程的,则是各个线程的桟),CPU寄存器的内容(多线程,则是线程的一组寄存器的值),程序静态分配变量的值(全局与static变量)
File core可以查看这个特定核心文件的名称,在bash中,可以使用ulimit命令控制核心文件的创建。如:
ulimit –c n : n是核心文件的最大大小,以千字节为单位,超过nKB的任何核心文件都不会被写。如果是创建任意大小的核心文件则:
ulimit –c unlimited,ulimit – c可以检查核心文件。
如果使用vim进行工程开发,是不是每次退出vim进行make比较麻烦,这里有个技巧可以避免退出vim,适用于单个没有makefile的代码,或者是有makefile的工程。在vim的命令行直接输入:make就可以直接编译了,如果程序有错误,可以使用:cnext或者cprev命令查看错误。有没有觉得很方便。
原文地址:http://blog.csdn.net/qianligaoshan/article/details/46389643