GDB调试及coredump详解

一、coredump:是针对程序异常而产生的core文件,包含程序运行时的内存、寄存器状态、堆栈指针、函数调用等信息,用于存储程序出错时的状态。

 

二、coredump的存储位置:与被执行文件在同一目录下。当然,位置可以在程序中通过 chdir 命令修改

 

三、如何判断是coredump文件:该文件主要的格式为 ELF 格式。可以通过

readelf -h core

进行判断,如图:

 

GDB调试及coredump详解_第1张图片

 

四、产生coredump的条件:

  1. 首先确认当前会话中的ulimit -c,若为0,则不会产生core,需要修改和设置。

附:

ulimit -c unlimited    #可以产生core且不受大小限制

ulimit -a        #显示当前各种用户进程设置

#ulimit的某些参数设置与运行机器的配置有关,慎重使用。

ulimit -d unlimited        #数据段长度

ulimit -m unlimited        #最大内存大小

ulimit -s unlimited        #堆栈大小

#以上是设置为无限制

#若是想设置对应字符大小,可以指定如下图:

ulimit -c [size]

GDB调试及coredump详解_第2张图片

可能 -c 设置成 4 也不会生成core,因人而异。

  1. 当前用户对写入core目录的写权限有足够的空间。

  2. 其他不会产生core文件的原因。

五、coredump产生的几种情况

  1. 内存访问越界

  2. 多线程程序使用不安全的线程函数

  3. 多线程读写的数据未加锁保护

  4. 非法指针

  5. 堆栈溢出

六、利用GDP进行coredump定位

 

  1. 记住几个常用的gdb命令:

 

l(list) ,显示源代码,并且可以看到对应的行号;

 

b(break)x, x是行号,表示在对应的行号位置设置断点;

 

p(print)x, x是变量名,表示打印变量x的值

 

r(run), 表示继续执行到断点的位置

 

n(next),表示执行下一步

 

c(continue),表示继续执行

 

q(quit),表示退出gdb

 

  1. 补充——使用list查看源代码命令:

 

list

 

显示程序第linenum行的周围的源程序。

 

list

 

显示函数名为function的函数的源程序。

 

list

 

显示当前行后面的源程序。

 

list -

 

显示当前行前面的源程序。

 

一般是打印当前行的上5行和下5行,如果显示函数是是上2行下8行,默认是10行,当然,你也可以定制显示的范围,使用下面命令可以设置一次显示源程序的行数。

 

setlistsize

 

设置一次显示源代码的行数。

 

showlistsize

 

查看当前listsize的设置。

 

list命令还有下面的用法:

 

list,

 

显示从first行到last行之间的源代码。

 

list ,

 

显示从当前行到last行之间的源代码。

 

list +

 

往后显示源代码。

 

一般来说在list后面可以跟以下这些参数:

 

   行号。

 

<+offset>   当前行号的正偏移量。

 

<-offset>   当前行号的负偏移量。

 

  哪个文件的哪一行。

 

  函数名。

 

哪个文件中的哪个函数。

 

<*address>  程序运行时的语句在内存中的地址。

 

  1. 一些常用signal的含义

 

SIGABRT:调用abort函数时产生此信号。进程异常终止。

 

SIGBUS:指示一个实现定义的硬件故障。

 

SIGEMT:指示一个实现定义的硬件故障。EMT这一名字来自PDP-11的emulator trap 指令。

 

SIGFPE:此信号表示一个算术运算异常,例如除以0,浮点溢出等。

 

SIGILL:此信号指示进程已执行一条非法硬件指令。4.3BSD由abort函数产生此信号。SIGABRT现在被用于此。

 

SIGIOT:这指示一个实现定义的硬件故障。IOT这个名字来自于PDP-11对于输入/输出TRAP(input/outputTRAP)指令的缩写。系统V的早期版本,由abort函数产生此信号。SIGABRT现在被用于此。

 

SIGQUIT:当用户在终端上按退出键(一般采用Ctrl-/)时,产生此信号,并送至前台进

 

程组中的所有进程。此信号不仅终止前台进程组(如SIGINT所做的那样),同时产生一个core文件。

 

SIGSEGV:指示进程进行了一次无效的存储访问。名字SEGV表示“段违例(segmentationviolation)”。

 

SIGSYS:指示一个无效的系统调用。由于某种未知原因,进程执行了一条系统调用指令,但其指示系统调用类型的参数却是无效的。

 

SIGTRAP:指示一个实现定义的硬件故障。此信号名来自于PDP-11的TRAP指令。

 

SIGXCPUSVR4和4.3+BSD支持资源限制的概念。如果进程超过了其软C P U时间限制,则产生此信号。

 

SIGXFSZ:如果进程超过了其软文件长度限制,则SVR4和4.3+BSD产生此信号。

 

 

你可能感兴趣的:(Linux)