1、gdb调试过程:
介绍:gdb不仅可以用来调试分析和解决实际问题,也可以用来学习程序运行的过程;
gdb的实现是靠ptrace,让被调试的程序作为gdb的子进程,有的通过gdb fork生成,
有的通过gdb attach收养,因此被调试子程序的所有信号和状态都可以被父进程监听和控制;
1)判断一个程序(可执行文件)是否带有调试信息:
gdb helloworld // helloworld表示要调试的可执行文件
如果出现no debugging symbols found表示该程序没有调试信息;
2)编译生成带调试信息的程序:
gcc -g // 编译时加上-g参数即可保留程序中的调试信息
3)开始调试:
gdb helloworld
然后就是用各种gdb命令来协助调试;
如run, next, step,break, bt, set args, show args, watch ...
2、core文件调试过程:
介绍:程序因为异常或bug造成crash可以产生core文件,通常core文件包含了程序运行时内存、
寄存器状态、堆栈指针、内存管理信息以及函数调用堆栈信息。core就是程序当前工作状态存储生成的一个文件,
通过工具分析这个文件,可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题点并解决。
1)查看coredump是否开启:
ulimit -c
如果为0表示coredump被关闭,通过如下设置开启:
ulimit -c unlimited
插一句:在windows系统cygwin下使能coredump还需要如下一步:
export CYGWIN="$CYGWIN error_start=dumper.exe -d %1 %2" // 添加到.bashrc或当前shell下运行
2)生成core文件:
./helloworld // 执行helloworld程序,如果程序异常crash就会在当前目录生成helloworld.core文件
3)利用core文件调试:
gdb helloworld helloworld.core
然后就可以用gdb的命令来查看和分析问题,常用的如bt来查看堆栈信息;