首页
社区
课程
招聘
[求助]android内核printk连续打印重启(真机)
发表于: 2016-12-13 06:21 7309

[求助]android内核printk连续打印重启(真机)

2016-12-13 06:21
7309
android内核printk连续打印调用信息(真机),直接死机后重启,
我以前处理过可以用的,现在怎么也想不起来是怎么做的了,
make menuconfig的dynamic printk选了也没用(ubuntu 14.04),
printk_ratelimit也是死机重启,
哪位大哥给个提醒?谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (19)
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一下
2016-12-13 21:37
0
雪    币: 18
活跃值: (721)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
printk本身是没问题的,应该是你自己写的代码的问题
2016-12-14 09:51
0
雪    币: 53
活跃值: (269)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
可以不用printk(), 将log信息写到文件里去!
2016-12-14 10:53
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
去掉printk,就运行没问题,卡死前会输出几条printk内容的,
这个只是针对连续输出的,
奇怪中
2016-12-14 14:40
0
雪    币: 112
活跃值: (293)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
不知道和上下文有没有关系,preempt_count()看一下是不是0
2016-12-14 16:42
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我使用
if(preempt_count()==0){
   printk
}
还是会重启
2016-12-15 01:13
0
雪    币: 3
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
printk(KERN_EMERG "------start-----------\n");这样试过吗,,,
2016-12-15 15:35
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
也是一样的,哪个只是输出日志的类别
2016-12-15 17:00
0
雪    币: 18
活跃值: (721)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
你倒是贴下你的代码呀
2016-12-15 17:08
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
11
贴代码吧。根据经验,应该是printk输出的调试信息出错。例如非法指针打印内容,取值的时候就跪了。
2016-12-15 17:27
0
雪    币: 3
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
贴吧贴吧,让我试试
2016-12-15 18:39
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
就是这么一条语句
printk(KERN_INFO "fbb: Found file -- %s -- %s -- %d\n", current->comm,filename,uid);
因为会输出很多条,
在open.c里面SYSCALL_DEFINE3里插入这么一条
这里前面uid=current->cred->uid;
有判断是指定大于多少的,如10058等,不输出系统进程的,
完整的:
int uid =current->cred->uid;
if(uid>10058){
  printk(KERN_INFO "fbb: Found file -- %s -- %s -- %d\n", current->comm,filename,uid);
}
这个在模拟器上是没问题的
2016-12-15 21:08
0
雪    币: 18
活跃值: (721)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
current->comm,filename这两个不一定是有效的字符串
2016-12-15 21:59
0
雪    币: 3
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
楼上是大神啊,深藏不露
2016-12-15 22:27
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
current-comm--当前进程的名称
filename--是open的文件名
这2个怎么会无效呢?
我测试过
if(current->comm && filename){
  printk
}
结果是一样的
2016-12-16 03:56
0
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
17
首先,你这if判断加的没啥用啊, comm是肯定不为NULL的,加了白加。filename是传入的用户空间内存指针,如果非空但是指向非法内存,照样要挂。
其次,其实我觉得看一下内核崩溃信息,什么问题就全清楚了。
最后,我猜你的printk再放底层一点,在系统检查完filename后再执行应该就没啥问题了。不过最好别用comm,这个不靠谱。

++++++++++++++++++++++++++++++++++++

补充:current为某一个特殊值的时候current->comm可能为NULL。
2016-12-16 11:08
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
我是这样解决的
if(strstr(current->comm,".so"){
  printk
}
else{
  printk
}
我怀疑这个是linux存在中断优化的问题,连续的prink不行,
一定要加点其他流程的中转才行
2016-12-16 15:43
0
雪    币: 2955
活跃值: (562)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
用其他方式也可以打印log
2016-12-16 17:04
0
雪    币: 9479
活跃值: (757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
内核只有printk啊
2016-12-16 18:12
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册