在平时的调试过程中遇到一些难以解决的问题,这时候就需要进行排查。比如在源码的各个函数中加入一些调试语句,以此查看程序的运行顺序及情况。但是在linux源码中有些.c文件动辄就几千行代码,里面的函数更是数不胜数,如果一个个手动添加打印语句,就会很耗费时间。这明显不是一个很好的选择。于是本文提供了一个基于Perl的脚本,用于在.c文件中的各个函数的开头加入特定的调试语句,以节省调试时间。
add_printf_to_all_func.pl
#!/usr/bin/perl
use strict;
use warnings;
if((scalar @ARGV) < 2)
{
printf "usage: \n $0 file_name outfile.\n";
exit -1;
}
my ($file,$outfile) = @ARGV;
my ($in,$out);
my $add_line='printk("%s\n", __func__);';
$add_line="\n\t$add_line\n";
my $line;
my $num = 0;
open $in , '<', $file or die "can't open input file $file" ;
open $out , '>',$outfile or die "can't open output file $outfile" ;
$/='{';
while ($line=<$in>)
{
my $outline = $line;
if($line =~/(\w+)\s*\([^\{\}\;\/]*\)(\s*|\n#endif\s*)\{$/)
{
my $name =$1;
my $pre = $`;
if(($name !~/^(if|for|while|do|switch|defined)$/)
&&($name !~/(for|do)_each/)
&& ($pre !~/\s(_init|_exit)\s+\w*\s*$/))
{
$num++;
$outline .= $add_line;
}
}
print $out $outline;
}
close $in;
print STDOUT $num, "\n";
add_printf.sh
#!/bin/sh
filelist=`ls *.c`
for file in $filelist
do
perl add_printf_to_all_func.pl ${file} ${file}.c
mv ${file}.c ${file}
done
使用方法
确保两个文件在同一文件夹下
./add_printf.sh