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