1. 计算结构体成员的偏移
2. 反汇编以及寻找出问题的行数
但大多情况下出问题的时候不是自己的内核,这时就要根据自己内核里的__mutex_lock_common符号地址(System.map里有)来计算地址再到objdump反汇编的代码里去找对应的汇编。这样就比较麻烦。gdb提供了一个很好的方式来造福懒人
可以看到已经替我算好了,在我的内核里__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---