where are the bug ?

Fan Yang lljyangfan at gmail.com
Sat Oct 20 22:39:39 EDT 2012


2012/10/20 Rohan Puri <rohan.puri15 at gmail.com>

>
>
> On Sat, Oct 20, 2012 at 7:35 AM, Fan Yang <lljyangfan at gmail.com> wrote:
>
>>
>>
>> 2012/10/19 Rohan Puri <rohan.puri15 at gmail.com>
>>
>>>
>>>
>>> On Fri, Oct 19, 2012 at 7:38 PM, Anuz Pratap Singh Tomar <
>>> chambilkethakur at gmail.com> wrote:
>>>
>>>>
>>>>
>>>> On Fri, Oct 19, 2012 at 2:46 PM, Fan Yang <lljyangfan at gmail.com> wrote:
>>>>
>>>>>
>>>>>
>>>>> 2012/10/19 Arun KS <getarunks at gmail.com>
>>>>> >
>>>>> > Hi Fan,
>>>>> >
>>>>> > On Fri, Oct 19, 2012 at 6:50 PM, Fan Yang <lljyangfan at gmail.com>
>>>>> wrote:
>>>>> >>
>>>>> >> HI ALL:
>>>>> >>     I just run a module on my machine, but it  can't work. When the
>>>>> module run the kernel will painc. I don't know where is wrong. This is my
>>>>> code:
>>>>> >>
>>>>> >>  1 #include<linux/module.h>
>>>>> >>   2 #include<linux/kernel.h>
>>>>> >>   3 #include<linux/init.h>
>>>>> >>   4 #include<linux/sched.h>
>>>>> >>   5
>>>>> >>   6 int input = 1;
>>>>> >>   7 module_param (input, int, S_IRUGO);
>>>>> >>   8
>>>>> >>   9 static int __init printvma_init (void)
>>>>> >>  10 {
>>>>> >>  11     struct vm_area_struct *p, *start;
>>>>> >>  12     int i;
>>>>> >>  13     struct task_struct *thread;
>>>>>
>>>>> >>  14
>>>>> >>  15     thread = current;
>>>>> >>  16
>>>>> >>  17     while (1)
>>>>> >>  18     {
>>>>> >>  19         if (thread->pid == input)
>>>>> >>  20             break;
>>>>> >>  21         thread = list_entry (thread->tasks.next, struct
>>>>> task_struct, tasks);
>>>>> >>  22     }
>>>>> >>  23     p = thread->mm->mmap;
>>>>> >>  24
>>>>> >>  25     do{
>>>>> >>  26         printk ("%lx\t%lx\t%s\n", p->vm_start,\
>>>>> >>  27                 p->vm_end, p->vm_file->f_path.dentry->d_iname);
>>>>> >>  28         p = p->vm_next;
>>>>> >>  29     }while (p != NULL);
>>>>> >>  30
>>>>> >>  31     printk ("vm_file address is:%d\tf_path address is:%d\
>>>>> >>  32             \tname is:%s",& p->vm_file->f_path,\
>>>>> >>  33             p->vm_file->f_path.dentry->d_iname);
>>>>> >>  34
>>>>> >>  35     printk ("info from the kernel space:%s\n", thread->comm);
>>>>> >>  36     return 0;
>>>>> >>  37 }
>>>>> >>  38
>>>>> >>  39 static void __exit printvma_exit (void)
>>>>> >>  40 {
>>>>> >>  41     printk ("the module will leave the kernel space..\n");
>>>>> >>  42 }
>>>>> >>  43
>>>>> >>  44 module_init (printvma_init);
>>>>> >>  45 module_exit (printvma_exit);
>>>>> >>  46 MODULE_LICENSE ("GPL");
>>>>> >>
>>>>> >>
>>>>> >> what's wrong?
>>>>> >
>>>>> >
>>>>> > It would be good if you paste your crash log here.
>>>>> >
>>>>> > Thanks,
>>>>> > Arun
>>>>> >>
>>>>> >>
>>>>> >> thanks
>>>>> >>
>>>>> >> _______________________________________________
>>>>> >> Kernelnewbies mailing list
>>>>> >> Kernelnewbies at kernelnewbies.org
>>>>> >> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>>>>> >>
>>>>> >
>>>>> The module run in a virtual machine, I can't control the machine when
>>>>> it crashed, so I just got a picture when the kernel panic.
>>>>>
>>>>> you can run the module under uml, it wont be hard to copy  the crash
>>>> log from terminal in uml.
>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> Thanks
>>>>> Fan
>>>>>
>>>>> _______________________________________________
>>>>> Kernelnewbies mailing list
>>>>> Kernelnewbies at kernelnewbies.org
>>>>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> Kernelnewbies mailing list
>>>> Kernelnewbies at kernelnewbies.org
>>>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
>>>>
>>>>
>>> Hi Fan,
>>>
>>> See the issue is thread->mm is NULL in your case. The simplest way to
>>> test this in your case is by the following : -
>>>
>>> Put these statements after the while loop
>>>
>>> if(!thread->mm) { printk("thread->mm is NULL\n"); return 0; }
>>>
>>> After this compile and load the module, you will see this statement
>>> printed in dmesg command output.
>>>
>>>
>>> General programming practice : -
>>>
>>> Always make checks for NULL pointer in your code, before dereferencing
>>> your code.
>>>
>>> - Rohan
>>>
>> Hi Rohan,
>>
>> I don't think the thread->mm is NULL, because when I print the several
>> vm_area_struct of the thread->mm it work well, but if put the code in the
>> loop to print all the vma, it crashed.
>>
>> Thinks
>> Fan
>>
>
> Hi Fan,
>
> Yes Fan, you are right, its NOT thread->mm NULL, but p->vm_file is NULL,
> to verify put the following as the fist statement in do {}while; loop
>
> if(!p->vm_file) { printk("p->vm_file NULL\n"); return 0;}
>
>
> This message gets printed to kernel log buffer.
>
> Also, you still need to NULL check pointer before dereferencing them. Let
> me know, whats the result on your system.
>
> - Rohan
>
Hi Roban:
You are right, the p->vm_file is NULL cause the panic. But it's crazy to
lead to the kernel panic for I just printk the NULL.

Ok, I know where I am wrong, thank you for your help, thank you everyone,
thank you very much !

Fan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20121021/e1d5d828/attachment.html 


More information about the Kernelnewbies mailing list