【问题标题】:kernel /proc/pid/stack format, what does the addresses mean?kernel /proc/pid/stack 格式,地址是什么意思?
【发布时间】:2020-09-01 02:57:40
【问题描述】:

给定如下的堆栈:

cat /proc/17019/stack
[<0>] futex_wait_queue_me+0xc4/0x120
[<0>] futex_wait+0x10a/0x250
[<0>] do_futex+0x325/0x500
[<0>] SyS_futex+0x13b/0x180
[<0>] do_syscall_64+0x73/0x130
[<0>] entry_SYSCALL_64_after_hwframe+0x3d/0xa2
[<0>] 0xffffffffffffffff

futex_wait_queue_me+0xc4/0x120这一行为例,0xc4和0x120是什么意思?

另外,我怎样才能找出这个地址对应的代码行?

【问题讨论】:

  • 使用 addr2line 获取行号

标签: process linux-kernel stack procfs


【解决方案1】:

futex_wait_queue_me+0xc4/0x120 - 在此函数的调用堆栈中,当前操作位于偏移量0xc4,函数的总大小为0x120,两者都是十六进制格式。对于 Kernel 子程序,可以通过 vmlinux 的 objdump 获取对应的行,前提是它有调试符号来映射它。

如下图system_call_fastpath所示,反汇编输出中0x22的当前偏移量实际上是34d

[root@linux ~]# cat /proc/26581/stack
[<ffffffff9f28eace>] ep_poll+0x23e/0x360  
[<ffffffff9f28ff9d>] SyS_epoll_wait+0xed/0x120
[<ffffffff9f774ddb>] system_call_fastpath+0x22/0x27
[<ffffffffffffffff>] 0xffffffffffffffff

(gdb) disassemble system_call_fastpath
Dump of assembler code for function system_call_fastpath:
0xffffffff81774db9 <+0>:     cmp    $0x14c,%rax
0xffffffff81774dbf <+6>:     jae    0xffffffff81774f43 <badsys>
0xffffffff81774dc5 <+12>:    sbb    %rcx,%rcx
0xffffffff81774dc8 <+15>:    and    %rcx,%rax
0xffffffff81774dcb <+18>:    mov    %r10,%rcx
0xffffffff81774dce <+21>:    mov    -0x7e7fd6c0(,%rax,8),%rax
0xffffffff81774dd6 <+29>:    callq  0xffffffff81386770 <__x86_indirect_thunk_rax>
0xffffffff81774ddb <+34>:    mov    %rax,0x50(%rsp)
End of assembler dump.
(gdb) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 2012-04-12
    • 2018-10-19
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多