- 论坛徽章:
- 0
|
Linux 内核调试器内幕zt
第 2 种情况:使用 strace
strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。将跟踪信息发送到应用程序及内核开发者都很有用。在清单 6 中,分区的一种格式有错误,清单显示了 strace 的开头部分,内容是关于调出创建文件系统操作(mkfs)的。strace 确定哪个调用导致问题出现。
清单 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)
- = ?
复制代码
清单 6 显示 ioctl 调用导致用来格式化分区的 mkfs 程序失败。ioctl BLKGETSIZE64 失败。(BLKGET-SIZE64 在调用 ioctl 的源代码中定义。) BLKGETSIZE64 ioctl 将被添加到 Linux 中所有的设备,而在这里,逻辑卷管理器还不支持它。因此,如果 BLKGETSIZE64 ioctl 调用失败,mkfs 代码将改为调用较早的 ioctl 调用;这使得 mkfs 适用于逻辑卷管理器。 |
|