能力值:
( LV2,RANK:10 )
|
-
-
2 楼
自己顶一下
|
能力值:
( LV4,RANK:50 )
|
-
-
3 楼
printk本身是没问题的,应该是你自己写的代码的问题
|
能力值:
( LV3,RANK:30 )
|
-
-
4 楼
可以不用printk(), 将log信息写到文件里去!
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
去掉printk,就运行没问题,卡死前会输出几条printk内容的,
这个只是针对连续输出的,
奇怪中
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
不知道和上下文有没有关系,preempt_count()看一下是不是0
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
我使用
if(preempt_count()==0){
printk
}
还是会重启
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
8 楼
printk(KERN_EMERG "------start-----------\n");这样试过吗,,,
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
也是一样的,哪个只是输出日志的类别
|
能力值:
( LV4,RANK:50 )
|
-
-
10 楼
你倒是贴下你的代码呀
|
能力值:
( LV12,RANK:270 )
|
-
-
11 楼
贴代码吧。根据经验,应该是printk输出的调试信息出错。例如非法指针打印内容,取值的时候就跪了。
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
12 楼
贴吧贴吧,让我试试
|
能力值:
( 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);
}
这个在模拟器上是没问题的
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
current->comm,filename这两个不一定是有效的字符串
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
15 楼
楼上是大神啊,深藏不露
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
current-comm--当前进程的名称
filename--是open的文件名
这2个怎么会无效呢?
我测试过
if(current->comm && filename){
printk
}
结果是一样的
|
能力值:
( LV12,RANK:270 )
|
-
-
17 楼
首先,你这if判断加的没啥用啊, comm是肯定不为NULL的,加了白加。filename是传入的用户空间内存指针,如果非空但是指向非法内存,照样要挂。
其次,其实我觉得看一下内核崩溃信息,什么问题就全清楚了。
最后,我猜你的printk再放底层一点,在系统检查完filename后再执行应该就没啥问题了。不过最好别用comm,这个不靠谱。
++++++++++++++++++++++++++++++++++++
补充:current为某一个特殊值的时候current->comm可能为NULL。
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
我是这样解决的
if(strstr(current->comm,".so"){
printk
}
else{
printk
}
我怀疑这个是linux存在中断优化的问题,连续的prink不行,
一定要加点其他流程的中转才行
|
能力值:
( LV2,RANK:10 )
在线值:
|
-
-
19 楼
用其他方式也可以打印log
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
内核只有printk啊
|
|
|