- 論壇徽章:
- 0
|
Linux 內(nèi)核調(diào)試器內(nèi)幕zt
第 2 種情況:使用 strace
strace 命令是一種強大的工具,它能夠顯示所有由用戶空間程序發(fā)出的系統(tǒng)調(diào)用。strace 顯示這些調(diào)用的參數(shù)并返回符號形式的值。strace 從內(nèi)核接收信息,而且不需要以任何特殊的方式來構(gòu)建內(nèi)核。將跟蹤信息發(fā)送到應(yīng)用程序及內(nèi)核開發(fā)者都很有用。在清單 6 中,分區(qū)的一種格式有錯誤,清單顯示了 strace 的開頭部分,內(nèi)容是關(guān)于調(diào)出創(chuàng)建文件系統(tǒng)操作(mkfs)的。strace 確定哪個調(diào)用導致問題出現(xiàn)。
清單 6. mkfs 上 strace 的開頭部分
- execve("/sbin/mkfs.jfs", ["mkfs.jfs", "-f", "/dev/test1"], &
- ...
- open("/dev/test1", O_RDWR|O_LARGEFILE) = 4
- stat64("/dev/test1", {st_mode=&, st_rdev=makedev(63, 255), ...}) = 0
- ioctl(4, 0x40041271, 0xbfffe128) = -1 EINVAL (Invalid argument)
- write(2, "mkfs.jfs: warning - cannot setb" ..., 98mkfs.jfs: warning -
- cannot set blocksize on block device /dev/test1: Invalid argument )
- = 98
- stat64("/dev/test1", {st_mode=&, st_rdev=makedev(63, 255), ...}) = 0
- open("/dev/test1", O_RDONLY|O_LARGEFILE) = 5
- ioctl(5, 0x80041272, 0xbfffe124) = -1 EINVAL (Invalid argument)
- write(2, "mkfs.jfs: can\'t determine device"..., ..._exit(1)
- = ?
復(fù)制代碼
清單 6 顯示 ioctl 調(diào)用導致用來格式化分區(qū)的 mkfs 程序失敗。ioctl BLKGETSIZE64 失敗。(BLKGET-SIZE64 在調(diào)用 ioctl 的源代碼中定義。) BLKGETSIZE64 ioctl 將被添加到 Linux 中所有的設(shè)備,而在這里,邏輯卷管理器還不支持它。因此,如果 BLKGETSIZE64 ioctl 調(diào)用失敗,mkfs 代碼將改為調(diào)用較早的 ioctl 調(diào)用;這使得 mkfs 適用于邏輯卷管理器。 |
|