gpt4 book ai didi

c - ptrace 读取子进程中的 errno 值

转载 作者:行者123 更新时间:2023-12-04 13:38:05 27 4
gpt4 key购买 nike

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

例如,如果我做 strace ls , strace 在调用失败时显示符号 errno 值(例如 ENOENT )。我知道 strace 在幕后使用 ptrace 。

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

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

谢谢

最佳答案

在系统调用之后,您需要获取寄存器,特别是 rax .如果系统调用失败,则 rax 的值将是一个很大的数字,例如 0xFFFFFFFFFFFFFFF4 . errno是通过否定这个数字来计算的,如下所示:
-0xFFFFFFFFFFFFFFF4 = 0xFFFFFFFFFFFFFFFF - 0xFFFFFFFFFFFFFFF4 + 1 = 0xC = 12
一旦您拥有 errno ,您可以在errno.h中查找.不同系统上的位置略有不同;如果你找不到它,你可以运行 echo "#include <errno.h>" | gcc -E - ,这将打印出位置。在这个例子中,错误是 ENOMEM .

关于c - ptrace 读取子进程中的 errno 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60644275/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com