如何转储失败的系统调用的内核堆栈跟踪?

如何转储失败的系统调用的内核堆栈跟踪?

这是一个经典问题。我想了解特定系统调用失败的原因。是否可以显示系统调用的内核堆栈跟踪:

  • 当返回非零或为负数时(它依赖于 syscall 来知道何时失败,也许我们应该根据失败来判断errno
  • 并且当执行到达返回指令时?

已尝试使用trace/trace-bpfcc来自bcc-tools(Fedora)/ bpfcc-tools(Ubuntu):

$ sudo /usr/sbin/trace-bpfcc -K 'r::do_sys_open "%llx", retval'&
$ touch /root  # As normal user
15979   15979   touch           do_sys_open      fffffffffffffffe
        kretprobe_trampoline+0x0 [kernel]
        do_syscall_64+0x5a [kernel]
        entry_SYSCALL_64_after_hwframe+0x44 [kernel]

但堆栈跟踪毫无意义。

相关内容