如何解释呼叫追踪

时间:2012-03-02 07:12:16

标签: 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 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
       ed9e9d5c 00000046 c1e5c800 c1e5c800 ed9e9d14 587dc805 00001e62 e884be00
       e884c054 c1e5c800 00000000 ed9e8000 f6333b80 00000000 00000000 001eda69
       00000000 e884be00 00000000 e884be00 c044319a 00000000 ed9e9d58 c013e912

任何人都可以向我解释一下吗?这些注册值是?更具体地说,我想知道是否可以从这些值推断出在调用跟踪中传递给函数的参数。 谢谢。

1 个答案:

答案 0 :(得分:2)

以下行的含义是:

 raw_device_be D c1e5c800  5984  9684   9683

挂起进程名称为raw_device_be,处于D状态,进程pc为c1e5c800,可用堆栈空间为5984,进程的pid为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

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