Debugging 如何解释调用跟踪

Debugging 如何解释调用跟踪,debugging,linux-kernel,kernel,Debugging,Linux Kernel,Kernel,我有来自内核的以下调用跟踪和信息: INFO: task raw_device_benc:9684 blocked for more than 120 seconds. "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. raw_device_be D c1e5c800 5984 9684 9683 ed9e9d5c 00000046 c1e5c800 c1e5c800 e

我有来自内核的以下调用跟踪和信息:

INFO: task raw_device_benc:9684 blocked for more than 120 seconds.
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
raw_device_be D c1e5c800  5984  9684   9683
       ed9e9d5c 00000046 c1e5c800 c1e5c800 ed9e9d14 587dc805 00001e62 e884be00
       e884c054 c1e5c800 00000000 ed9e8000 f6333b80 00000000 00000000 001eda69
       00000000 e884be00 00000000 e884be00 c044319a 00000000 ed9e9d58 c013e912
Call Trace:
 [<c044319a>] ? _spin_unlock_irqrestore+0x36/0x3c
 [<c013e912>] ? trace_hardirqs_on+0xe9/0x111
 [<c044126d>] io_schedule+0x1e/0x28
 [<c018ec95>] __blockdev_direct_IO+0x9a9/0xaf2
 [<c014e2da>] ? generic_file_buffered_write+0x116/0x4e1
 [<c017efa6>] ? mnt_drop_write+0x4f/0xbc
 [<c018db1a>] blkdev_direct_IO+0x30/0x35
 [<c018da31>] ? blkdev_get_blocks+0x0/0xb9
 [<c014e067>] generic_file_direct_IO+0xda/0x125
 [<c014eecf>] generic_file_aio_read+0x9c/0x49f
 [<c013f7d1>] ? __lock_acquire+0xaea/0xb32
 [<c016c2c3>] do_sync_read+0xab/0xe9
 [<c0132f0d>] ? autoremove_wake_function+0x0/0x33
 [<c044192d>] ? mutex_unlock+0x8/0xa
 [<c018cb2d>] ? block_llseek+0xbe/0xcc
 [<c016c218>] ? do_sync_read+0x0/0xe9
 [<c016c9bc>] vfs_read+0x8a/0x106
 [<c016cdef>] sys_read+0x3b/0x60
 [<c0103809>] sysenter_past_esp+0x6a/0xb1
 =======================
no locks held by raw_device_benc/9684.
谁能给我解释一下吗?这些是寄存器值吗?更具体地说,我想知道是否可以从这些值推断调用跟踪中传递给函数的参数。
谢谢

以下行的含义是:

 raw_device_be D c1e5c800  5984  9684   9683
挂起的进程名称为raw_device_be,它处于D状态,进程pc位于c1e5c800,可用堆栈空间为5984,进程的pid为9684,进程的父pid为9683

剩下的几行:

  ed9e9d5c 00000046 c1e5c800 c1e5c800 ed9e9d14 587dc805 00001e62 e884be00
   e884c054 c1e5c800 00000000 ed9e8000 f6333b80 00000000 00000000 001eda69
   00000000 e884be00 00000000 e884be00 c044319a 00000000 ed9e9d58 c013e912

是堆栈数据。从进程的当前堆栈指针(sp)开始,将打印24字(96字节)的堆栈数据。如果您知道堆栈是如何增长和收缩的,并且拥有vmlinux的反汇编代码,那么您可以找到函数的参数。当然,给定的堆栈数据有限

谢谢!这很有帮助。但是,在给定这些信息的情况下,我是否可以获得堆栈指针和完整的堆栈数据?
  ed9e9d5c 00000046 c1e5c800 c1e5c800 ed9e9d14 587dc805 00001e62 e884be00
   e884c054 c1e5c800 00000000 ed9e8000 f6333b80 00000000 00000000 001eda69
   00000000 e884be00 00000000 e884be00 c044319a 00000000 ed9e9d58 c013e912