DEBUG之动态log调试

DEBUG之动态log调试

简介:

  动态log调试指的是在kernel代码中pr_debug()等log调试函数的打开与关闭。在我现在的理解中,打开动态log调试就是让pr_debug()这个定义在内核中的log打印函数“起作用”。打开动态log调试之后,用dmesg命令查看内核log时,会看到相关模块内pr_debug()中要打印的内容出现在内核log中。而关闭动态log调试后,在内核log中不会看到pr_debug()中要打印的内容。在这里pr_debug()只是动态log调试控制的其中一个函数,但不只这一个函数,由于其它函数我没有接触过,就不列举
了。

  本文只介绍动态log打开关闭的基本方法,对其原理不胜了解,就不阐述了。

方法:

以高通的SDM660芯片为例:

打开动态log调试:

1.首先在android源码目录找到/kernel/msm-4.4/arch/arm64/configs/sdm660_defconfig文件,查看其中的CONFIG_DYNAMIC_DEBUG=y这句宏定义是否存在,存在表明动态调试配置好了,不存在就加上再重新编译一下代码。默认情况下是 已经配置好的。

2.然后adb shell连接设备控制台。

3.执行echo ‘8 6 1 7’ > /proc/sys/kernel/printk,把printk语句都打开。

4.执行echo -n “file 文件名 +p” > /sys/kernel/debug/dynamic_debug/control,打开对应文件名里的pr_debug()语句,这一步就是打开动态log调试。

5.再执行dmesg查看kernel内的输出log是否有你想要的log。

关闭动态log调试:

1.执行echo -n “file 文件名 -p” > /sys/kernel/debug/dynamic_debug/control,就关闭了动态log调试。

结语:

  动态log调试在我的工作中暂时还没什么机会用到,我也就用过一次。关于内核为什么要设计动态log调试这个模块,我有一点猜想。log打印毕竟是要消耗CPU的资源,增加进程的总运行时间的。log打印语句太多会造成CPU资源的浪费和进程运行卡顿,但有些时候又必需要添加很多log来调试程序怎么办?动态log调试就解决了这个问题,在需要的时候才打开很多log输出语句,不需要的时候就关闭它。

DEBUG之抓取蓝牙分析log

DEBUG之抓取蓝牙分析log

前言:

  DEBUG的故事相信大家都不陌生,简单来说就是在早期计算机体积比较庞大的时期,一只虫子飞到计算机的线路里,造成了计算机短路,然后工作人员排查原因时,发现原来是这只虫子造成的。后来,就把解决计算机系统缺陷、漏洞叫做DEBUG.

  当前,DEBUG和BUG这两个词经常被用在计算机软件行业。

  我想,做过DEBUG的都知道,log是在DEBUG过程中被提及最多的一个东西。那什么是log呢?log中文名叫日志,它能反应出程序在计算机或其他系统中当前的状态、位置、时间等参数。通俗来说就是log是报告当前程序运行到哪了,它是什么状态的输出语句,它可以告诉程序员当前程序是正常运行还是出错了,在什么地方出错的,通过log文件来检查程序运行情况以及快速排查错误。其实,log也是程序的一部分,它是需要程序员在程序中的一些位置加入输出语句,才能形成详细的log文件。

  这篇文章主要讲一下android系统下的log获取。

log的分类:

Android系统中不同模块log类型如下图所示:

内核空间log抓取方法:

  Android系统有用户空间和内核空间,获取不同空间下log的方法也是不一样的。内核空间是系统的底层,占用系统的内存相较于用户空间要少,代码量也少,它的log输出内容有电池、内存等系统物理资源状态以及驱动的运行情况。获取内核log方法如下:

方法一:

1.adb shell;

2.cd mnt/sdcard;

3.dmesg > kernellog.txt <文件存放路径>
;注意:此方式不要在安卓的根目录下执行

方法二:

1.adb shell dmesg > kernellog.txt <文件存放路径>;

  若有:…:Read-only file system的错误,只是因为你所在的system文件夹是只读文件夹,需要改变文件夹的属性,有两种方式:一、mount -o remount -o rw /system;二、root,disable-verity,reboot,root,remount.注意这两种方式都要是userdebug版本的安卓。

  以上是常用的方法。内核空间还有一种动态log调试的方法,这个就下次再讲了,本文主要讲解log的概述。

用户空间log抓取方法:

  在内核空间以上,也就是hal层、framework层、应用层都可以用logcat来抓取log。抓取方法如下:

方法一:进程阻塞终端一直抓

adb shell logcat > Logcat.txt

方法二:在android内开后台进程抓

1.logcat -v threadtime > Logcat.txt &;

-v是控制log的输出格式,threadtime是日志输出时间和线程信息。更多logcat 参数用法用:logcat –hlep查看。

2.Kill 进程号

这里的进程号是在执行第一步之后,系统给出的,这步的作用就是结束后台抓log的进程。

蓝牙snoop log抓取方法:

  Android中做蓝牙BUG分析抓取log的方法为:

step 0:adb pull system/etc/bluetooth/bt_stack.conf,把bt_stack.conf文件pull出来,用编辑器将文件中的log等级都改成6。然后再adb push system/etc/bluetooth/bt_stack.conf

step 1: adb shell setprop persist.bluetooth.btsnoopenable true 或者手机进入开发者模式,打开开发者选项中Enable Bluetooth HCI snoop log,这两者的作用是相同的,就是抓取snoop log。

step 2:重启蓝牙一次。

step 3:adb shell;cd mnt/sdcard; logcat -v threadtime > Logcat.txt &

Step4:androi O 及以上版本btsnoop log 将保存在 /data/misc/bluetooth/logs/
将logcat、snooplog、.cfa log都拉出来进行分析,.cfa文件用蓝牙协议工具(comproble protocol analysis system)打开。

这里一共抓取了两种log:logcat log 和btsnoop log。蓝牙的大部分问题都能用这两种log结合代码分析出来。其实蓝牙还有一种log叫OTA log,这种log要专业的设备才能抓取,它显示的是蓝牙从baseband到最上层的profile整个协议栈两个蓝牙设备之间的交互命令和数据。

结语:

  以上讲的都是DEBUG的第一步,获取log原材料,接着就是分析log,在这一步中你就需要些经验了,这一步别人很难帮到你。搜索log中的关键字,找你怀疑的地方,继续在代码中添加你自己的log,再抓取一遍log,不断排查原因,找到解决方案,DEBUG就算完成了。

Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

发表新文章

在文件夹Hexo/source/_posts中,点击鼠标右键选择Git Bash Here。在命令行中输入:

1
2
$ hexo g #生成
$ hexo d #部署

上述命令也可合并成:

1
$ hexo d -g #生成并部署

结束的学生时代

  时光荏苒,一晃而过。转眼间就大四毕业了,回首望去,只留下遗憾与不舍。这次毕业也意味着我学生时代的结束,有些猝不及防的感觉,虽然我一直有意识的提醒自己快结束了,但越是接近离开,心里越是五味杂陈。
  我强迫自己不去思考过去,而是直面未来。在自己的想象中社会是残酷的,我对踏入社会是有些恐惧,同时在此时对学校有着很强的留恋。对未来的迷茫、恐惧和对过去的留恋一直缠绕了我好几天,我知道我必须摆脱这种感觉,勇敢地走下去。所以,我在昨天写了一篇日记,把自己的恐惧、迷茫、不舍以及对未来的思考都写在了纸上。把情绪都书面化,就像是把情绪都发泄出来似的,心情好多了,理智慢慢地回归,我终于可以冷静地思考自己的未来。有时候,当你感觉难受的时候,把它通过日记的形式写出来,似乎是个不错的发泄方法,我似乎又找到的一个不错的方法。
  今天是毕业的第二天,离别的难受正在慢慢淡去。因为一些事情,我也还没去上班,这是一个难得缓冲期。不管如何,直面将来的一切,不要再伤春悲秋了。我现在还是会恐惧,恐惧面对社会残酷的一面。但生活会使我坚强,生活会使我前进,我会接收生活给我的一切。时间是个伟大的作者,它会给所有人一个完美的结局,但过程的辛酸苦辣也是你必须品尝的。
  以此篇纪念我结束的学生时代吧!

使用Shadowsocks搭建梯子的教程

想写博客很久了,但又不知道写些什么,就用我已经实现的这种翻墙方法来作为我的第一篇博客吧!第一次写,如果有什么不好的地方敬请见谅!

###这是一个教程博客,博客没有说明搭梯子过程中涉及到的原理。
首先是准备好必要的软件工具:Xshell、Shadowsocks。
将上述两个软件下载并安装在电脑上。

###第一步:
注册并登录Vultr网站,这是一个卖服务器的公司,你可以在这个网站买到位于海外的服务器,当然它们公司还提供其他服务,这里就不介绍了。它的网址是https://my.vultr.com。在这个网站买服务器支持支付宝和微信支付,但它首先要让你在账号里预冲10美元,60多块钱,同时它服务器现在最便宜是5美元一个月。我现在一般不用这个网站买服务器了。因为,我在一开始冲了10美元后,它又往我的账号里赠送了50美元,我还高兴了一阵,但后来应该是到期了,网站又给我扣回去了,10美元我差不多用了2个月,我账户就欠费了。而在这两个月中,我没太多时候用到外网,我觉得有点不划算。所以,不经常上外网,不推荐用这个网站。
在账户中有了钱之后就可以买服务器了。如图,首先点击图中右侧的加号),进行服务器部署。如下图先选服务器的地址,我一般选新加坡、加拿大或者美国的服务器,因为这几个国家的服务器能连接的概率较高,)。然后选服务器系统类型,选择CentOS6*64的系统,如下图所示。)。然后选择服务器的价格,其他的选择默认,就可以安装服务器了。在服务器安装完成后,你就可以得到服务器的IP和密码,如下图所示。

###第二步:
打开安装的XShell软件,新建一个会话。在主机栏填入你在上一步中获取的服务器IP,其它默认,如下图所示。。接着点击用户身份验证,在用户名栏填入root,密码栏填入你的服务器密码,其它默认。点击确定,等待电脑与服务器连接,如果连接失败,说明你买的服务器被墙了,你就得回到第一步重新买另一个地址的服务器了,再部署安装。之后,再试着用XShell与它连接,直到连接成功。

###第三步:
连接服务器后,开始在 服务器端安装Shadowsocks。按以下顺序操作:
一、在XShell中分步输入 1、yum -y install wget 2、wget -N –no-check-certificate https://raw.githubusercontent.com/ToyoDAdoubi/doubi/master/ssr.sh 3、bash ssr.sh
二、然后按XShell中给的提示操作,各步操作输入如下:1;8080;密码,自己设也可默认;10;1;1;设备数,默认;限速上限,默认;默认;y。
以上这两步操作完成后,服务器端的Shadowsocks就安装好了。

###第四步:
给服务器安装加速器,让网速更快,此步是可选项,也就是说,你可以不做这步。CentOS664安装锐速加速,CentOS764安装bbr加速,这里只介绍安装锐速加速。
一、更换服务器端内核,要输入的命令如下 1、wget –no-check-certificate https://blog.asuhu.com/sh/ruisu.sh 2、bash ruisu.sh 这一步服务器因为要重启,需要等待几分钟。
二、安装锐速,要输入的命令如下 1、wget -N –no-check-certificate https://raw.githubusercontent.com/91yun/serverspeeder/master/serverspeeder-all.sh 2、 bash serverspeeder-all.sh 最后,如果出现Running,即为安装成功。

###第五步:
配置电脑端的Shadowsocks,在电脑上打开Shadowsocks,双击它的图标进入配置界面。在服务器IP栏填入你的服务器IP,密码栏填入你在第二步设置的密码,而不是服务器的密码。然后其它参数栏中填入你在第二步设置的相应参数,没标“*”的参数可以不填。最后,点击确定。

###第六步:
至此,你的梯子已经搭建完成了。现在,用浏览器访问谷歌或Youtube,测试能否访问外网。如果不能,请仔细检查并确认你的全部步骤是否出错。