9.2.5. システムコール結果の改ざん

システムコールから返されたエラーをシミュレートすると、プログラムで不足しているエラー処理の特定に役立ちます。

特定のシステムコールの結果としてプログラムが一般的なエラーを受け取るには、-e fault= オプションを指定して strace ユーティリティーを実行し、システムコールを指定します。

$ scl enable devtoolset-10 'strace -e fault=syscall program argument...'

エラーの種類または戻り値を指定するには、-e inject= オプションを使用します。

$ scl enable devtoolset-10 'strace -e inject=syscall:error=error-type program argument'
$ scl enable devtoolset-10 'strace -e inject=syscall:retval=return-value program argument'

エラータイプと戻り値は相互排他的であることに注意してください。

例9.5 システムコール結果の改ざん

lsblk という名前の実行ファイルを考慮してください。このファイルで strace ユーティリティーを実行すると、mmap() システムコールがエラーを返すようにします。

$ scl enable devtoolset-10 '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 +++