Linux oops stack 分析

#include
#include

#include

#include
#include

MODULE_LICENSE("Dual BSD/GPL");

int L3(int p)
{
 int *a = NULL;
 printk("in Level 3, p=%x", p);
 dump_stack();
 *a = 100;
 return 0;
}

int L2(int p)
{
 int s=0x22;
 printk("In L2 s=%x p=%x\n", s,p);
 L3(0x100);
 return 0;
}

int L1(int p1,int p2)
{
 int s1=0x11, s2=0x1111;
 printk("In L1 ,s1=%x  s2=%x p1=%x p2=%x\n",s1,s2,p1,p2);
 L2(2);
 return 0;
}

int init_module(void)
{
 printk("init Module \n");
 L1(0x0,0x1); 
 
    return 0;

}

void cleanup_module(void)
{
   // test();
   printk("into cleanup_module.\n");

}

 

 

init Module
In L1 ,s1=11  s2=1111 p1=0 p2=1
In L2 s=22 p=2
in Level 3, p=100 [] dump_trace+0x69/0x1af
 [] show_trace_log_lvl+0x18/0x2c
 [] show_trace+0xf/0x11
 [] dump_stack+0x15/0x17
 [] L3+0x18/0x27 [drv]
 [] L2+0x25/0x2b [drv]
 [] L1+0x31/0x37 [drv]
 [] init_module+0x1b/0x22 [drv]
 [] sys_init_module+0x17db/0x1974
 [] syscall_call+0x7/0xb
DWARF2 unwinder stuck at syscall_call+0x7/0xb
Leftover inexact backtrace:
 =======================
BUG: unable to handle kernel NULL pointer dereference at virtual address 00000000
 printing eip:
d086502b
*pde = 00000000
Oops: 0002 [#1]
SMP
last sysfs file: /devices/pci0000:00/0000:00:10.0/host0/target0:0:0/0:0:0:0/vendor
Modules linked in: drv(U) autofs4 hidp rfcomm l2cap bluetooth vmblock(U) vmmemctl(U) sunrpc ipv6 freq_table vmhgfs(U) dm_multipath video sbs i2c_ec button battery ac parport_pc lp parport snd_ens1371 gameport snd_rawmidi floppy snd_ac97_codec snd_ac97_bus snd_seq_dummy snd_seq_oss snd_seq_midi_event snd_seq snd_seq_device snd_pcm_oss pcnet32 sg pcspkr snd_mixer_oss vmxnet(U) snd_pcm i2c_piix4 mii i2c_core snd_timer snd soundcore snd_page_alloc ide_cd cdrom serio_raw dm_snapshot dm_zero dm_mirror dm_mod mptspi mptscsih mptbase scsi_transport_spi sd_mod scsi_mod ext3 jbd ehci_hcd ohci_hcd uhci_hcd
CPU:    0
EIP:    0060:[]    Tainted: P      VLI
EFLAGS: 00010246   (2.6.18-1.2798.fc6 #1)
EIP is at L3+0x1a/0x27 [drv]
eax: 00000000   ebx: d0865580   ecx: ca75a66c   edx: 00000046
esi: ca75a400   edi: ca75a690   ebp: ca75a66c   esp: ca691e94
ds: 007b   es: 007b   ss: 0068
Process insmod (pid: 2344, ti=ca691000 task=ca64c3f0 task.ti=ca691000)
Stack: d08650d2 00000100 d086505d d08650e3 00000022 00000002 d0865094 d08650f4
       00000011 00001111 00000000 00000001 d08650b5 d0865115 c043b02d d08655c8
       c0623e21 d086558c d08facc0 ca691f64 ca75e224 d0865580 00000000 00000000
Call Trace:
 [] L2+0x25/0x2b [drv]
 [] L1+0x31/0x37 [drv]
 [] init_module+0x1b/0x22 [drv]
 [] sys_init_module+0x17db/0x1974
 [] syscall_call+0x7/0xb
DWARF2 unwinder stuck at syscall_call+0x7/0xb
Leftover inexact backtrace:
 =======================
Code: 83 ec 04 c7 04 24 bc 50 86 d0 e8 9e c5 bb ef 58 c3 83 ec 08 89 44 24 04 c7 04 24 d2 50 86 d0 e8 89 c5 bb ef e8 42 10 ba ef 31 c0 05 00 00 00 00 64 00 00 00 5a 59 c3 83 ec 0c 89 44 24 08 c7
EIP: [] L3+0x1a/0x27 [drv] SS:ESP 0068:ca691e94
 
分析:
Stack TOP:
d08650d2 a>
00000100 p>
d086505d
d08650e3
00000022 s>
00000002 p>
d0865094
d08650f4
00000011s1>
00001111s2>
00000000p1>
00000001p2>
d08650b5 d0865115
c043b02d d08655c8

压栈顺序: 函数参数,局部变量,EBP,EIP.
函数参数的顺序默认为:从右到左。(­__cdecl)
局部变量:后声明的先入栈。


 

 

转载于:https://www.cnblogs.com/yizhinantian/archive/2009/02/04/LinuxStack.html

你可能感兴趣的:(Linux oops stack 分析)