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 +++