Ptrace read errno值在子进程中
strace如何在跟踪的过程中从失败的系统调用中获取errno 例如,如果我执行Ptrace read errno值在子进程中,c,system-calls,errno,strace,ptrace,C,System Calls,Errno,Strace,Ptrace,strace如何在跟踪的过程中从失败的系统调用中获取errno 例如,如果我执行strace ls,当调用失败时,strace将显示符号errno值(例如enoint)。我知道strace在引擎盖下使用ptrace 如果使用ptrace跟踪进程系统调用,如何读取跟踪进程中的errno值 更具体地说,如何在子进程中获取errno的地址,以便使用PTRACE\u PEEKDATA或process\u vm\u readv读取它 谢谢在系统调用之后,您需要获取寄存器,特别是rax。如果系统调用失败,则
strace ls
,当调用失败时,strace将显示符号errno值(例如enoint
)。我知道strace在引擎盖下使用ptrace
如果使用ptrace跟踪进程系统调用,如何读取跟踪进程中的errno值
更具体地说,如何在子进程中获取errno的地址,以便使用PTRACE\u PEEKDATA
或process\u vm\u readv
读取它
谢谢在系统调用之后,您需要获取寄存器,特别是
rax
。如果系统调用失败,则rax
的值将是一个高数值,例如0xfffffffffff4
errno
通过对该数字求反来计算,如下所示:
-0xFFFFFFFFF4=0xFFFFFFFFFFFFFF-0xFFFFFFFFFFF4+1=0xC=12
一旦有了
errno
,就可以在errno.h
中查找它。不同系统的位置略有不同;如果您找不到它,可以运行echo“#include”| gcc-E-
,它将打印出位置。在本例中,错误是ENOMEM
(此时为每线程变量),而不是系统概念。放置在errno
中的值是对系统调用返回的值的求反。这就是读取RAX和设置RAX(重写系统调用时)的原因。我看到了我的错误:strace输出指示系统调用返回-1,但我假设-1也在RAX
中返回,但事实并非如此。我编写的程序也正确地显示了rax
是errno
的否定。感谢您免费发布答案。我太累了,你显然有可以共享的工作代码:)