9.2.5. 使用系统调用结果修改
模拟从系统调用返回的错误可帮助识别程序中缺少的错误处理。
要使程序在特定系统调用时收到通用错误,请使用 -e fault=
选项运行 strace
工具并提供系统调用:
$ scl enable devtoolset-11 'strace -e fault=syscall program argument...'
要指定错误类型或返回值,请使用 -e inject=
选项:
$scl enable devtoolset-11 'strace -e inject=syscall:error=error-type program argument'
$scl enable devtoolset-11 'strace -e inject=syscall:retval=return-value program argument'
请注意,指定错误类型和返回值是互斥的。
例 9.5. 使用系统调用结果修改
考虑名为 lsblk
的可执行文件。在这个文件中运行 strace
工具,使 mmap()
系统调用返回错误:
$ scl enable devtoolset-11 'strace -e fault=mmap:error=EPERM lsblk > /dev/null'
execve("/usr/bin/lsblk", ["lsblk"], 0x7fff1c0e02a0 /* 54 vars */) = 0
brk(NULL) = 0x55d9e8b43000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 EPERM (Operation not permitted) (INJECTED)
writev(2, [{iov_base="lsblk", iov_len=5}, {iov_base=": ", iov_len=2}, {iov_base="error while loading shared libra"..., iov_len=36}, {iov_base=": ", iov_len=2}, {iov_base="", iov_len=0}, {iov_base="", iov_len=0}, {iov_base="cannot create cache for search p"..., iov_len=35}, {iov_base=": ", iov_len=2}, {iov_base="Cannot allocate memory", iov_len=22}, {iov_base="\n", iov_len=1}], 10lsblk: error while loading shared libraries: cannot create cache for search path: Cannot allocate memory
) = 105
exit_group(127) = ?
+++ exited with 127 +++