linux调试

主要介绍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"

# Linux 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×