Chinaunix首页 | 论坛 | 博客
  • 博客访问: 385651
  • 博文数量: 39
  • 博客积分: 1771
  • 博客等级: 上尉
  • 技术积分: 1231
  • 用 户 组: 普通用户
  • 注册时间: 2005-05-01 14:21
文章分类

全部博文(39)

文章存档

2013年(1)

2012年(4)

2011年(16)

2010年(6)

2009年(12)

分类: LINUX

2012-08-06 11:12:58

1. 计算结构体成员的偏移
譬如说要计算struct inode结构里i_mapping的偏移:
(gdb) p &((struct inode*)0).i_mapping
$1 = (struct address_space **) 0x140
这样连这个偏移的类型都打出来了。如果只要简单的偏移可以这样:
(gdb) p/x &((struct inode*)0).i_mapping
$3 = 0x140

2. 反汇编以及寻找出问题的行数
譬如说碰到如下的kernel panic,要找到出问题的地方所对于的源代码的行数,并且要反汇编看看出问题的汇编代码语句。
BUG: unable to handle kernel paging request at f624050a
IP: [] __mutex_lock_common+0x53/0x3b0
如果是自己的内核跑出来的,要找到源码行数可以直接addr2line:
# addr2line -e vmlinx c1976843
然后用objdump反汇编找出c1976843地址的汇编语句。
但大多情况下出问题的时候不是自己的内核,这时就要根据自己内核里的__mutex_lock_common符号地址(System.map里有)来计算地址再到objdump反汇编的代码里去找对应的汇编。这样就比较麻烦。gdb提供了一个很好的方式来造福懒人
$ gdb vmlinux
(gdb) l *__mutex_lock_common+0x53
0xc190f5a3 is in __mutex_lock_common (/home/leon/workspace/android/ics-r3/hardware/intel/linux-2.6/arch/x86/include/asm/spinlock.h:65).
60
61 static __always_inline void __ticket_spin_lock(arch_spinlock_t *lock)
62 {
63 short inc = 0x0100;
64
65 asm volatile (
66 LOCK_PREFIX "xaddw %w0, %1\n"
67 "1:\t"
68 "cmpb %h0, %b0\n\t"
69 "je 2f\n\t
可以看到已经替我算好了,在我的内核里__mutex_lock_common+0x53对应的地址为0xc190f5a3。然后用gdb来反汇编这个函数找到这个地址就可以了:
(gdb) disassemble __mutex_lock_common
Dump of assembler code for function __mutex_lock_common:
   0xc190f550 <+0>: push   %ebp
   0xc190f551 <+1>: mov    %esp,%ebp
   0xc190f553 <+3>: push   %edi
   0xc190f554 <+4>: push   %esi
   0xc190f555 <+5>: push   %ebx
   0xc190f556 <+6>: sub    $0x24,%esp
   0xc190f559 <+9>: call   0xc1912384
   0xc190f55e <+14>: mov    %eax,%ebx
   0xc190f560 <+16>: mov    %fs:0xc1c5f4ec,%eax
   0xc190f566 <+22>: mov    %eax,-0x20(%ebp)
   0xc190f569 <+25>: mov    $0x1,%eax
   0xc190f56e <+30>: mov    %edx,-0x28(%ebp)
   0xc190f571 <+33>: call   0xc1239b90
   0xc190f576 <+38>: mov    0xc1c7bf64,%eax
   0xc190f57b <+43>: test   %eax,%eax
   0xc190f57d <+45>: jne    0xc190f593 <__mutex_lock_common+67>
   0xc190f57f <+47>: mov    %esp,%eax
   0xc190f581 <+49>: and    $0xffffe000,%eax
   0xc190f586 <+54>: testl  $0x7ffff00,0x14(%eax)
   0xc190f58d <+61>: jne    0xc190f872 <__mutex_lock_common+802>
   0xc190f593 <+67>: pushf  
   0xc190f594 <+68>: pop    %edi
   0xc190f595 <+69>: cli    
   0xc190f596 <+70>: call   0xc12cb8d0
   0xc190f59b <+75>: lea    0x4(%ebx),%esi
   0xc190f59e <+78>: mov    $0x100,%eax
   0xc190f5a3 <+83>: lock xadd %ax,0x4(%ebx)
   0xc190f5a9 <+89>: cmp    %ah,%al
   0xc190f5ab <+91>: je     0xc190f5b4 <__mutex_lock_common+100>
   0xc190f5ad <+93>: pause  
   0xc190f5af <+95>: mov    0x4(%ebx),%al
   0xc190f5b2 <+98>: jmp    0xc190f5a9 <__mutex_lock_common+89>
   0xc190f5b4 <+100>: mov    0xc1c7bf64,%eax
   0xc190f5b9 <+105>: test   %eax,%eax
   0xc190f5bb <+107>: jne    0xc190f5c6 <__mutex_lock_common+118>
   0xc190f5bd <+109>: cmp    0x24(%ebx),%ebx
   0xc190f5c0 <+112>: jne    0xc190f8c5 <__mutex_lock_common+885>
   0xc190f5c6 <+118>: lea    -0x1c(%ebp),%edx
   0xc190f5c9 <+121>: mov    %ebx,%eax
   0xc190f5cb <+123>: call   0xc128f1c0
   0xc190f5d0 <+128>: mov    -0x20(%ebp),%edx
   0xc190f5d3 <+131>: mov    %ebx,%eax
   0xc190f5d5 <+133>: mov    0x4(%edx),%ecx
   0xc190f5d8 <+136>: lea    -0x1c(%ebp),%edx
   0xc190f5db <+139>: call   0xc128ef00
   0xc190f5e0 <+144>: mov    0x18(%ebx),%edx
   0xc190f5e3 <+147>: lea    0x14(%ebx),%eax
   0xc190f5e6 <+150>: mov    %eax,-0x2c(%ebp)
   0xc190f5e9 <+153>: mov    %eax,%ecx
   0xc190f5eb <+155>: lea    -0x1c(%ebp),%eax
   0xc190f5ee <+158>: call   0xc14ff540 <__list_add>
   0xc190f5f3 <+163>: mov    -0x20(%ebp),%edx
   0xc190f5f6 <+166>: mov    $0xffffffff,%eax
---Type to continue, or q to quit---


阅读(2446) | 评论(0) | 转发(0) |
0

上一篇:UIWDT debug

下一篇:cross compile tools

给主人留下些什么吧!~~