将这三天的工作分享一下,希望对大家有帮助,其实遇到问题要一步一步的调试程序才能找到问题所在。
对于core文件的生成:
1、core文件大小
一般core文件大小默认设置0,可通过ulimit -a命令查看,通过命令ulimit -c unlimited设置core文件大小为无穷大,也可设置成固定大小,但是如果
core文件足够大,则会对core文件惊醒裁剪,裁剪之后的core文件通过gdb调试会出错,由于不是完整的。
设置ulimit -c unlimited永久有效的方法是写入到/etc/profile中,echo “ulimit -c unlimited" >>/etc/profile,在适当的脚本文件中添加这句命令即可。
2、core文件生成格式
默认情况下生成的core文件命名为core,但是有时候需要更清楚的了解是哪个段错误产生的core文件,我们则需要更改core文件的格式
通过下面两句命令实现:
echo “kernel.core_uses_pid=1">>/etc/sysctl.conf /*使其可以更改core文件的格式*/
echo "kernel.core_pattern=/home/core-%e-%p-%t">>/etc/sysctl.conf /*设置生成的core文件放在什么地方,以及core文件格式,%e表示命令名,%p表示进程号,%t表示时间(1970.1.1到今天的秒数)*/
sysctl -p /etc/sysctl.conf /*这条命令可以不执行,重启就可以,执行这条命令就不需要重启*/
同时可以通过下面命令来查看这两个参数的值
cat /proc/sys/kernel/core_uses_pid
cat /proc/sys/kernel/core_pattern
core文件是表示出现段错误而出现的
所以应该要不停的扫描core文件所在的目录文件,我采用的是一分钟扫描一次
while [ 1 ]
do
sleep 60
done
对于core所在目录下怎么提取出core文件中,我在这里通过for循环查找,并判断是否为空,若没有core文件,则跳出for循环,继续到while循环中轮询
for file in `find /var/log/uitlog -name "core-*"`
do
if [ ! $file ];then
break
fi
echo $file
done
对于生产的core文件格式,提取出命令名,使用下面命令,-F "-"是将“-”作为分隔符,print $2,打印第二个参数
cmdtmp=$(echo $file |awk -F "-" '{print $2}')
在gdb调试时,使用命令为gdb 命令 core文件,命令以及core文件最好采用的是绝对路径,否则可能会出错
在脚本中使用gdb调试,并把调试的信息打印到文本文档中(由于生成的core文件太大,最好是在保存调试打印信息到corelog.txt中,然后删除core文件)
在脚本中我们使用EOF,注意第二个配对的EOF一定要顶格写,并且gdb中输入的命令要空一行 。set logging file 文件名,表示将调试信息打印到指定文件中
set logging on表示将下面命令的打印信息存到指定文件中,bt指调试命令,set logging off表示停止输入。
gdb $cmd $file <
set logging file /corelog.txt
set logging on
bt
set logging off
quit
EOF
调试完之后,应该删除掉core文件,以免占用太大空间
rm $file
完整的实现core脚本的文件为
while [ 1 ]
do
for file in `find /var/log/uitlog -name "core-*"`
do
if [ ! $file ];then
break
fi
echo $file
cmd=$(echo $file |awk -F "-" '{print $2}')
echo "command="$cmd
gdb $cmd $file <
set logging file /corelog.txt
set logging on
bt
set logging off
quit
EOF
rm $file
done
sleep 60
done
调试脚本的命令是:
sh -x XXXX
阅读(3125) | 评论(0) | 转发(0) |