Ptrace在子进程中读取errno值

strace如何在跟踪过程中从失败的系统调用中获取errno?

例如,如果我执行strace ls,则strace在呼叫失败时显示符号errno值(例如ENOENT)。我知道strace在后台使用ptrace。

如果我使用ptrace跟踪系统调用的进程,如何在跟踪的进程中读取errno的值?

更具体地说,如何在子进程中获取errno的地址,以便可以使用PTRACE_PEEKDATAprocess_vm_readv来读取它?

谢谢

mdd000000 回答:Ptrace在子进程中读取errno值

在系统调用之后,您需要获取寄存器,特别是rax。如果系统调用失败,则rax的值将是一个较高的数字,例如0xFFFFFFFFFFFFFFF4errno的计算是通过取反这样的数字来计算的:

-0xFFFFFFFFFFFFFFF4 = 0xFFFFFFFFFFFFFFFF - 0xFFFFFFFFFFFFFFF4 + 1 = 0xC = 12

拥有errno后,您可以在errno.h中查找它。在不同的系统上,位置有所不同。如果找不到它,可以运行echo "#include <errno.h>" | gcc -E -,它将打印出位置。在此示例中,错误为ENOMEM

本文链接:https://www.f2er.com/2661719.html

大家都在问