Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ptrace read errno值在子进程中_C_System Calls_Errno_Strace_Ptrace - Fatal编程技术网

Ptrace read 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如何在跟踪的过程中从失败的系统调用中获取errno

例如,如果我执行
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
的否定。感谢您免费发布答案。我太累了,你显然有可以共享的工作代码:)