文章标签 » debug

一个函数搞定PHP调试日志

对,你没有看错,不是syslog,也不是一坨class,一个函数搞定。。。
—————————-
今天有个搞C++同事问我PHP怎么打印日志,于是贴了他一个函数,绝对实用~
https://gist.github.com/emptyhua/5055043

function debug_log() {
    if (false) return; //开关
    static $fp = 0;
    if ($fp === 0) {
        $logname = 'myprojectname';//日志名称
        $fp = fopen('/tmp/' . $logname . '.debug.log', 'a');
    } 
    $traces = debug_backtrace();
    $trace = count($traces) > 1 ? $traces[1] : $traces[0];
    $log_msg = date('Y-m-d H:i:s') . ' FILE:' . basename($trace['file']) . ' FUNC:' . $trace['function'] . ' LINE:' . $trace['line'] . ' :' . "\n";
    foreach(func_get_args() as $arg) {
        if (is_string($arg)) {
            $log_msg .= $arg . ' ';
        } else {
            $log_msg .= var_export($arg, true) . ' ';
        }
    }
    fwrite($fp, $log_msg . "\n");
}
debug_log('队列ID:', $queue_id, '内容:', $task_infos);
2013-02-28 16:53:40 FILE:task.inc.php FUNC:_get_locate_task LINE:347
队列ID: locate337512971_taskqueue 内容: array (
)

vim里快速调试PHP

恩,python中一般会把调试代码跟普通代码混在一块

class xx:
#    .....
if __name__ == '__main__':
    testxx = xx()
    #测试代码....

这个__name__ == ‘__main__’判断此文件是否被直接执行,而不是被其他文件import,所以在vim中调试时可以直接输入:!python % 执行当前正在编辑的文件,调试代码便会执行并输出结果

php也可以这么加调试代码,php中是这么实现的

class xx {
// ......
}
//确定当前被执行的文件就是自己,而不是被其他php文件包含
if (realpath($_SERVER['SCRIPT_FILENAME']) == __FILE__)
{
    $testxx = new xx;
    //测试代码....
}

如果仅限在命令行运行测试代码就再加个条件

if (php_sapi_name() == 'cli' && realpath($_SERVER['SCRIPT_FILENAME']) == __FILE__)

为了更速度,vim配置里添加了一个快捷键F5

"php和python调试快捷键
au FileType php map <F5> :call DebugRun('php')<cr>
au FileType php imap <F5> <Esc>:call DebugRun('php')<cr>
au FileType python map <F5> :call DebugRun('python')<cr>
au FileType python imap <F5> <Esc>:call DebugRun('python')<cr>
function DebugRun(cmd)
    :w
    execute '!' . a:cmd . ' %'
endfunction

OK,写完调试代码按下F5立刻有结果。

———–
post by gmail~

php整型溢出导致的小问题~

今天把一直本地测试的php程序放到外网的机器跑(64位系统),没想到一个纯算数值的算法竟然得到不一样的结果,最后锁定在一个求模的操作上:$i % 4, $i在本地和server上打印出来都是434807526976, 但是求出来的结果却不一样~

原因是:
php的整型最大值为2147483647(32位系统上), 当数值赋值超过这个最大值时,变量便自动成为浮点型. 所以虽然打印出来一样,但本地打印的是一个是浮点型的$i,而server上是64位系统,整型最大值达到9223372036854775807  …. $i依然是一个整型.

取模运算的结果不一样是因为php在对数值取模运算时会把浮点数转换为整型再取模(这点就不如js了,js是可以对浮点取模运算地~)

所以本地32位系统运行的其实是: ((int) $i) % 4 即 512559680 % 4

解决方法 : 最后为了保持与其他平台的一致,强制在64系统也”溢出” : ($i & 0xFFFFFFFF) % 4

————————————————

php也是一个比较无厘头的东西~

ie下暴力debug js

ie下的脚本错误总是很神秘的样子,告诉你哪个行,确不告诉你哪个文件,Visual Studio带了一个调试工具倒是可以,long long ago之前用过一次,老崩溃的样子~
如果你又遇到了猜不透的bug,可以尝试下面的shell~

//现去firefox里收集一份js列表
var alljs = [];
XN.array.each(document.getElementsByTagName('script'),function(i,v)
{
    if (v.src)
    {
        alljs.push(v.src);
    }
});
console.log(alljs.join('\n'));

把列表保存到一个文件,下面跑段shell,把所有js的报错位置的代码打印出来

// 10 100是ie里提示的错误位置
sh ~/bin/get_line.sh /tmp/jslist 10 100

附:

#!/bin/sh
LIST="$1"
ROW="$2"
COL="$3"
 
if [ ! -n "$ROW" ];then
    exit
fi
 
echo "行:${ROW}"
echo "列:${COL}"
 
get_row()
{
    cat /tmp/js_debug_tmp | sed -n "${ROW}p"
}
 
cat "$LIST" | while read line
do
    wget -q "$line" -O /tmp/js_debug_tmp 
    echo "文件:${line}"
    row="`get_row`"
 
    if [ -n "${COL}" ]; then
        row="`echo \"${row}\" | cut -c ${COL}- `"
    fi
 
    echo "$row"
done
rm /tmp/js_debug_tmp

还原用户环境失败…

话说昨天采集了用户的系统和软件信息,今天用虚拟机还原了一个,但是失败了,bug没有重现~

过程还是挺费功夫的:
首先用户用的番茄花园xp sp2, 虚拟机里用迅雷秒杀了,超赞公司网速~
Virtualbox里系统装好,下面就是比较头疼的,按照补丁列表打补丁…

hualu@lu-hua:patch$ cat /tmp/allsofts.txt | grep -E "\(KB[0-9]{6}" | sed -e 's/.*(\(KB[^)]*\).*/\1/' | wc -l
138

软件列表里一共有138个补丁, 对着列表在360卫士里挨个找着选的话估计我这老眼就废了…

还是自己写脚本去微软下载

#!/bin/sh
 
ID="$1"
if [ ! -n "$ID" ];then
    exit
fi
echo '-----------------------------------'
BASEURL='http://www.microsoft.com'
 
get_first_link()
{
   cat "$1" | grep "Windows XP" | grep "<a" | sed -e 's/.*href="\([^"]*\)".*/\1/' \
       -e 's/.*;u=//' \
       -e 's/%2f/\//g' \
       -e 's/%3f/\?/g' \
       -e 's/%3d/\=/g'
}
 
get_second_link()
{
    cat "$1" | grep 'id="quickCheck"' | sed -e "s/.*window\.open('\([^']*\)',.*/\1/"
}
 
url="${BASEURL}/downloads/results.aspx?pocId=7&freetext=${ID}&DisplayLang=zh-cn"
echo "${url}"
 
wget "${url}" -q -O /tmp/get_ms_link
 
surl="`get_first_link /tmp/get_ms_link`"
 
if [ ! -n "${surl}" ];then
    echo "${ID}补丁不存在"
    echo "${ID}" >> ./patch_not_found.txt
    exit
fi
 
surl="${BASEURL}${surl}"
echo "${surl}"
 
wget "${surl}" -q -O /tmp/get_ms_link
turl="`get_second_link /tmp/get_ms_link`"
echo "${turl}"
if [ ! -n "${turl}" ];then
    echo "${ID}补丁不存在"
    echo "${ID}" >> ./patch_not_found.txt
    exit
fi
 
wget "${turl}"
 
echo '-----------------------------------'

不知道微软有没有专门的补丁下载入口,不过我还是模仿我知道的方法下载了,先搜索,然后结果里找,使用:sh get_ms_patch.sh KB975467

然后几个老套的命令

#取出所有补丁编号
cat allsofts.txt | grep -E "\(KB[0-9]{6}" | sed -e 's/.*(\(KB[^)]*\).*/\1/' > /tmp/allpatch.txt
#下载所有补丁
cat /tmp/allpatch.txt | xargs -i sh /home/hualu/bin/get_ms_update.sh "{}"
#生成批量安装补丁的批处理文件
find ./ -name "*.exe" | sort | xargs -i basename {} | xargs -i echo ".\{} /passive /norestart" >> install.bat

回到虚拟xp里,挂在网络驱动,双击install.bat,开始安装… 等我吃完午饭,补丁都装完了,灰常激动,立刻重启,打开ie,登录淫淫,进入个人主页, fuck, 没有脚本错误!!!!

估计今天我嘴上的泡就是因为这个起的,真上火… , 后面,我接着按照软件列表装了瑞星,offcie 2007,均没有看到我期待的脚本错误

看来我得研究星座了…