准备
编译时添加指令保留源码信息,便于调试
-g
开启保存段错误使能,当程序执行出现段错误时,就会生成core文件
#在终端执行: ulimit -c unlimited
启动gdb调试
调试正在运行的程序
#查看进程id
ps -aux | grep program
#调试pid进程程序
gdb pid
core段错误调试
#删除现有有的core
rm -f core
#执行程序,直到程序报段错误(core dumped)
./program
#调试core
gdb ./program core
在docker容器上使用gdb
1.docker使能生成core dump,在宿主机上执行:
echo '/tmp/core.%t.%e.%p'|sudo tee /proc/sys/kernel/core_pattern
2.给docker run参数添加:
--ulimit core=-1 --security-opt seccomp=unconfined
3.docker image 安装gdb
sudo apt-get install gdb
4.进入gdb
sudo docker ps -a
sudo docker exec -it container_id bash
5.生成core dumped,运行程序出现segmentation fault
6.调试
sudo gdb /var/www/program /tmp/core.45s45s4d
常用指令
在源码16行设置断点:break 16
在Afunc函数入口打断点:break Afunc
查看所有断点信息:info break
运行程序:run
执行下一步:next
继续执行:c
打印变量i:p i
退出函数:finish
退出gdb:q
调试正在运行的程序:gdb PID
在源文件file的line处断点:break file:line
在源文件file的func处断点:break file func
显示段错误信息(会逐行显示错误信息,并且编号在句首):where
显示堆栈信息:bt
查看某處段錯誤(n表示段错误编号):frame n
切换线程:thread tid