主要介绍linux的调试,包括gdb以及core文件
GDB调式
core文件的生成
-
【生成】redhat默认是不产生core文件的,要想产生,需修改环境文件,假设是ies用户,则在/home/ies/.bashrc中加入
ulimit -c unlimited
-
【进程名与目录】如果要想在core文件名中加入引起崩溃的进程名,如下设置,产生的core文件会存放在引起崩溃的进程所在的目录,文件形式为core.%e, %e就是引起崩溃的进程名。
# sysctl "kernel.core_pattern=core.%e"
如果还要要指定core放置目录,将命令修改为如下:
# sysctl "kernel.core_pattern=/home/ies/corefile/core.%e"
-
【进程ID】想在文件名中加上进程ID,执行如下命令:
# sysctl "kernel.core_uses_pid=1"
反之,则执行:
# sysctl "kernel.core_uses_pid=0"
调试基本命令【验】
-- gcc -g
-- b main
-- r
-- C-c or C-a
-- n
-- watch trace
-- p bk ;打印变量
-- bt ;看调用堆栈
-- p &bk.year 地址
-- x/16wx 地址
-- set *(unsigned int *)地址=2015
-- w bk ;哪个变量改它就会停掉
-- c
-- finish ;跳出现有函数
-- info b ;看断点信息
调试正在运行程序
gdb ./a.out pid
-- 调试正在运行程序
call
-- 系统调用
-- call print("hello world")
-- call open("/dev/pts/12", 2) ; $3 ;文件句柄
-- call dup2(3, 0)
detach
-- 调试与运行分离
调试已经崩溃的程序:core dump
-- process core su ??
-- ulimit -c unlimited
-- gdb ./exam --core=core
-- ddd ./main :linux下窗口调试
调式多线程【验】
-- C-c
-- info threads ;查看线程信息
-- c
-- thread 2 ;现场设置为2线程
-- set scheduler-locking on ;设置锁开,此时只打印2线程内容
-- set scheduler-locking off ;关闭锁,恢复打印2线程
linux程序内存检测: Valgrind
-- valgrind ./sample
-- 缺点:运行会方面20倍
linux程序内存检测: memwatch
-- 将memwath.c memwatch.h复制到被编译的代码中
-- 每个原文件中都包含memwatch.h
-- 重新编译代码,gcc选项中使用-DMEMWATCH
core文件
两个文件
-- /proc/sys/kernel/core_uses_pid
是否添加pid作为扩展
-- /proc/sys/kernel/core_pattern
生成的目录、core文件名控制
%e: execuatable name 进程名
%p: pid 进程id
%t: time 生成时间(s)
%h: hostname 主机名
%u: uid
-- ps:在以上文件中修改,重启无效,上述文件只能看。
2个步骤
-- 1、在/etc/profile中,将ulimit -c 65536 添加进
-- 2-1、在/etc/sysctl.conf中添加
kernel.core_uses_pid = 1
kernel.core_pattern = /corefile/core.%e-%p-%t
-- 2-2、或者 在profile中添加
sysctl "kernel.core_uses_pid=1"
sysctl "kernel.core_pattern=/corefile/core.%e-%p-%t"